Python - Programmation orientée objet - _Nouveau() et mode Singleton

python programmation orient objet nouveau


Mode Singleton

C'est un modèle de conception

  • Le modèle de conception est un résumé et un raffinement des travaux antérieurs,En général,Les modèles de conception largement répandus sont des solutions matures à un problème particulier
  • Le modèle de conception est utilisé pour réutiliser le Code、Rendre le code plus facile à comprendre、Garantir la fiabilité du Code

Mode de conception unique

  • Objectif:Objet d'instance créé par une classe,Il n'y a qu'un seul objet d'instance dans l'ensemble de l'application et l'objet est facilement accessible à l'extérieur,Afin de contrôler facilement le nombre d'instances et d'économiser les ressources du système
  • Chaque exécution Objet retourné,L'adresse mémoire est la même

Nom de la classe()

Scénarios d'application pour un modèle de conception unique

  • Objet du lecteur de musique
  • Objet de la corbeille
  • Objet de l'imprimante
  • .....

Pourquoi le mode Singleton?

  • Questions:Comment s'assurer qu'une classe n'a qu'une seule instance et que cette instance est facilement accessible?
  • N'utilisez pas le mode Singleton:La définition d'une variable globale garantit que l'objet est accessible à tout moment,Mais il n'empêche pas l'Instanciation de plusieurs objets
  • L'apparition du mode Singleton:La classe elle - même est responsable de la création d'un seul objet d'instance,.Vous pouvez vous assurer qu'aucune autre instance n'a été créée,Et il peut fournir un moyen d'accéder à l'Instance

__new__ Méthodes

Utiliser Nom de la classe() Lors de la création d'un objet,Python L'interpréteur pour appelle d'abord __new__ Méthode d'attribution de l'espace mémoire à l'objet

class PoloBlog:
def __new__(cls, *args, **kwargs):
print("Assigner une adresse mémoire")
def __init__(self):
print("Initialiser l'objet...")
blog = PoloBlog()
print(blog)
# Résultats obtenus
Assigner une adresse mémoire
None

Hé!,Pourquoi l'objet imprimé est None,Et n'a pas été appelé à __init__ Et la méthode???Voici une explication!

Méthode statique intégrée

__new__ C'est un object Méthode statique intégrée fournie par la classe de base

__new__ Rôle principal

  • Allouer de l'espace à l'objet instance en mémoire
  • Renvoie la référence de l'objet à Python Interpréteur

Python Une fois que l'interpréteur a obtenu la référence de l'objet,Utiliser la référence de l'objet comme premier paramètre,Passer à __init__ Méthodes

Réécriture __new__ Méthodes

  • Le Code réécrit est fixe
  • Réécriture __new__ La méthode doit être à la fin

return super().__new__(cls)

  • Si non return(Comme le Code châtaignier ci - dessus),Python L'interpréteur pour n'a pas reçu de référence d'objet avec l'espace alloué,La méthode d'initialisation de l'objet n'est pas appelée(__init__)
  • Points saillants:__new__ Est une méthode statique,Une livraison proactive est nécessaire au moment de l'appel cls Paramètres
class PoloBlog:
def __new__(cls, *args, **kwargs):
# 1、Appel automatique __new__
print("Assigner une adresse mémoire")
# 2、Les références résultant de l'attribution d'un espace à un objet sont assignées à instance
instance = super().__new__(cls)
print(id(instance))
# 3、Renvoie la référence de l'objet à Python Interpréteur
return instance
def __init__(self):
print("Initialiser l'objet...")
print(id(self))
blog = PoloBlog()
# Résultats obtenus
Assigner une adresse mémoire
4363809888
Initialiser l'objet...
4363809888

Vous pouvez voir que les deux adresses de mémoire imprimées sont les mêmes Oh:Preuve __new__ La référence de l'objet assigné a effectivement été transmise à __init__ Méthode self Paramètres

__new__ Mise en œuvre du mode Singleton

class PoloBlog:
def __new__(cls, *args, **kwargs):
print("Assigner une adresse mémoire")
instance = super().__new__(cls)
return instance
def __init__(self):
print("Initialiser l'objet...")
blog = PoloBlog()
blog1 = PoloBlog()
print(id(blog))
print(id(blog1))
# Résultats obtenus
4449363040
4449361984

C'est évident,Les deux objets ont leurs propres adresses mémoire;Simple réécriture __new__ La méthode n'implémente pas le mode Singleton

__new__ Mettre en œuvre la logique du mode Singleton

Cas unique:Il n'y a qu'un seul objet d'instance dans toute l'application

  1. Définir une propriété de classe,Pour sauvegarder une référence à un objet Singleton
  2. Réécriture __new__ Méthodes
  3. Si les propriétés de la classe is None,La méthode parent est appelée pour allouer de l'espace mémoire,Et assigner une valeur à l'attribut de classe
  4. Si une propriété de classe a déjà une référence d'objet,Retour direct

Mise en œuvre du Code en mode Singleton

# Mode Singleton
class PoloBlog:
instance = None
def __new__(cls, *args, **kwargs):
# 1、Déterminer si l'attribut de classe est None
if cls.instance is None:
# 2、Vide,Appeler la méthode parent,Allouer de l'espace mémoire à l'objet,Et assigner une valeur à l'attribut de classe
cls.instance = super().__new__(cls)
# 3、Si ce n'est pas vide,Renvoie directement la référence de l'objet enregistrée par la propriété class
return cls.instance
def __init__(self):
pass
blog = PoloBlog()
blog1 = PoloBlog()
blog2 = PoloBlog()
print(id(blog), id(blog1), id(blog2))
# Résultats obtenus
4336982096 4336982096 4336982096

Vous pouvez voir que les trois objets d'instance créés sont en fait les mêmes,C'est le mode Singleton!

L'initialisation n'est effectuée qu'une seule fois

Chaque fois que vous utilisez un nom de classe()Lors de la création d'un objet,Python L'interpréteur pour appelle automatiquement les deux méthodes

  • __new__ Espace alloué
  • __init__ Initialisation de l'objet

Le mode Singleton décrit ci - dessus,Oui. __new__ Méthode de réécriture,La création de plusieurs objets d'instance donne le même objet d'instance

Mais:La méthode d'initialisation peut encore être appelée plus d'une fois

class PoloBlog:
instance = None
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
def __init__(self):
print("yep")
blog = PoloBlog()
blog1 = PoloBlog()
blog2 = PoloBlog()
# Résultats obtenus
yep
yep
yep

Supposons que vous vouliez que l'action d'initialisation ne soit exécutée qu'une seule fois?

C'est aussi simple,C'est à peu près la même solution que le modèle Singleton

  1. Définir si une balise d'attribut de classe a effectué une action d'initialisation,La valeur initiale est False
  2. In __init__ Dans la méthode,Propriétés de la classe de jugement,Si False,Effectuer l'action d'initialisation,Et ensuite réglé à True
  3. Si True Sauter directement ne pas exécuter
# Mode Singleton
class PoloBlog:
instance = None
init_flag = None
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
def __init__(self):
# 1、Déterminer si oui ou non True,Parce que c'est une méthode d'instance,Donc appeler une propriété de classe à travers un objet de classe
if PoloBlog.init_flag:
# 2、Si True,Sauter directement sans effectuer d'initialisation ultérieure
return
# 3、Si False,Exécution
print("Initialiser l'action")
# 4、Modifier init_flag
PoloBlog.init_flag = True
blog = PoloBlog()
blog1 = PoloBlog()
blog2 = PoloBlog()
# Résultats obtenus
Initialiser l'action

Participation à cet articleTencent Cloud Self - media Sharing Plan,Bienvenue à la lecture,Partager ensemble.

版权声明
本文为[Notes de test pour les petits ananas]所创,转载请带上原文链接,感谢
https://javamana.com/2021/09/20210914180056949g.html

  1. Java 16 is coming online. You can't even use the features of Java 8, can you?
  2. Java (3) basic data types and their type conversion
  3. 一位Java大牛的BAT面试心得与经验总结,2021年Java春招面试经历,
  4. 一举拿下腾讯美团滴滴offer,快来瞧瞧这份Spring面试小抄!
  5. 一个Java应届生从上海离职,万字长文总结Java多进程,
  6. Seven design principles of java object-oriented design pattern
  7. 一個Java應届生從上海離職,萬字長文總結Java多進程,
  8. Un nouvel étudiant Java a quitté Shanghai et a résumé plusieurs processus Java.
  9. Prenez d'un coup l'offre de Tencent meituan et jetez un coup d'oeil à cette copie de l'entrevue de printemps!
  10. L'expérience et l'expérience d'un Maverick Java en matière d'entrevue sur les MTD, l'expérience de l'entrevue d'embauche du printemps Java en 2021,
  11. Interface graphique X: mise à jour des tables de rendu et optimisation du Code (compilation intégrée 10)
  12. Widget de vérification de fichiers personnalisés Linux
  13. Java thread pool - work queue
  14. [Part 7] - Summary of B2B2C e-commerce technology of spring cloud live mall managed by git branch
  15. Reflection type of Java Foundation
  16. Want to get started with data structures, but always fall under the pomegranate skirt of the linked list?
  17. Interviewer: do redis transactions satisfy atomicity?
  18. 一篇文章教你搞定计算机网络面试,350道Java面试真题分享,
  19. 一条正确的Java职业生涯规划,揭秘今年Java春招面试必问问题有哪些?
  20. 一名毕业三年的女程序媛面试头条经验,关于Redis主从节点数据过期一致性的思考,
  21. Huawei cloud guassdb (for redis) released a new version: Lua script and SSL connection encryption
  22. Java thread pool - work queue
  23. 一名畢業三年的女程序媛面試頭條經驗,關於Redis主從節點數據過期一致性的思考,
  24. Trois ans d'expérience d'entrevue avec une femme de programmation diplômée, une réflexion sur la cohérence de l'expiration des données de redis Master slave Node,
  25. Un plan de carrière Java correct, découvrez les questions que vous devez poser lors de l'entrevue d'embauche du printemps Java de cette année.
  26. 万字详解微服务的哨兵机制,架构师带你玩转Redis高性能缓存设计实战,
  27. Un article vous a appris à gérer les entrevues sur le Web, à partager 350 vraies questions d'entrevue Java,
  28. Jquery Tools Methodology collation, Sharing a little interview Experience
  29. Tutoriel de développement Java, compétences de base nécessaires pour interviewer un programmeur Java dans une grande usine,
  30. "Anti Mafia storm" has just finished, another criminal investigation play has come, and the supporting actor is more popular than the protagonist
  31. 萬字詳解微服務的哨兵機制,架構師帶你玩轉Redis高性能緩存設計實戰,
  32. L'architecte vous guidera dans la conception de cache haute performance de redis.
  33. Linux驱动开发: 杂项字符设备
  34. Jquery plug - in urianchor, app front end Development
  35. Linux驅動開發: 雜項字符設備
  36. Développement de pilotes Linux: périphériques de caractères divers
  37. Utilisez @ async dans Spring boot pour effectuer des appels asynchrones et accélérer l'exécution des tâches!
  38. $in jquery, Visualized Web Development Tool
  39. Le développement Java doit être fait. Les entrevues https demandent souvent une analyse complète.
  40. 不明白JVM虚拟机还怎么面试,一起刷完了这份1307页的Java面试宝典吧,
  41. 不断提升自己创造溢价的能力,字节跳动 阿里 华为 腾讯等大厂Java面试题,
  42. Jdk's Past Life: The Classic Features of Thin Number - java5 - - - 15 -, webfront Development
  43. Résumé des questions d'entrevue pour les ingénieurs en développement Java, analyse des questions d'entrevue à haute fréquence Dubbo,
  44. Améliorer continuellement leur capacité à créer des primes, et les questions d'entrevue Java d'Alibaba Huawei Tencent et d'autres grandes usines sont sautées en octets.
  45. Install docker YJ version of openSUSE 11.3
  46. Je ne comprends pas comment la machine virtuelle JVM peut encore interviewer, et j'ai terminé ce dictionnaire d'entrevue Java de 1307 pages.
  47. 中软国际Java机试,如何写出高效率的SQL?
  48. 中级Java工程师面试,阿里 头条 腾讯等大厂Java笔试题目分享,
  49. 两年Java开发经验,为什么spring能最好地改变Java?
  50. Echarts realizes the rotation of the moon (super simple, you can see it at a glance)
  51. Deux ans d'expérience dans le développement de Java, pourquoi Spring peut - il le mieux changer Java?
  52. Entretien d'ingénieur Java intermédiaire, partage de sujets d'examen écrit Java de grandes usines comme Alibaba headline Tencent,
  53. Zhongsoft International Java Machine test, comment écrire un SQL efficace?
  54. Reflection type of Java Foundation
  55. Comment gérer efficacement les changements dans les ressources k8s?Analyse du mécanisme de mise en œuvre de k8s informer
  56. Installation de jdk1.8
  57. MySQL column - Linux underlying interaction and RAID storage architecture
  58. Interviewer: do redis transactions satisfy atomicity?
  59. 兩年Java開發經驗,為什麼spring能最好地改變Java?
  60. Migration practice from zookeeper to Nacos