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://pythonmana.com/2021/09/20210914180056949g.html

  1. 程序員是這樣學習【中藥學】知識的,先用python采集分析一波
  2. Python - pydantic(2)嵌套模型
  3. Python - 面向对象编程 - __dict__
  4. Python - 面向对象编程 - 反射 hasattr、getattr、getattr、delattr
  5. Python - 面向对象编程 - 实战(6)
  6. Python - 面向对象编程 - 魔术方法(双下划线方法)
  7. Python - 面向对象编程 - __new__() 和单例模式
  8. Python - 面向对象编程 - __call__()
  9. Python - repr()、str() 的区别
  10. Python - 面向对象编程 - __repr__()
  11. Python - eval()
  12. 用 Django REST framework 来实现一次性验证码(OTP)
  13. Python code checking tool (static code review)
  14. Python QT GUI Design: overview of UI interface visualization components and properties (Fundamentals - 3)
  15. 【算法学习】1863. 找出所有子集的异或总和再求和(java / c / c++ / python / go / rust)
  16. [apprentissage de l'algorithme] 1863. Trouver la somme Xor de tous les sous - ensembles (Java / C / C + + / python / go / Rust)
  17. Python code checking tool (static code review)
  18. Python 万能代码模版:爬虫代码篇
  19. Modèle de code universel Python: Code crawler
  20. 收藏 | Python 之 Pandas系统性总结!
  21. Take you to learn more about nginx basic login authentication: generating passwords using Python
  22. 超硬核Python避坑学习方案奉上!入门到就业一篇就搞定!
  23. Talk about how JMeter executes Python scripts concurrently
  24. Talk about how JMeter executes Python scripts concurrently
  25. Talk about how JMeter executes Python scripts concurrently
  26. python内置函数通过字符串的方式来执行函数代码块,类似java的反射机制相当强大!
  27. python内置函数通过字符串的方式来执行函数代码块,类似java的反射机制相当强大!
  28. python內置函數通過字符串的方式來執行函數代碼塊,類似java的反射機制相當强大!
  29. Les fonctions intégrées Python exécutent des blocs de code de fonction à travers des chaînes, et les mécanismes de réflexion comme Java sont assez puissants!
  30. Python module 1
  31. Python tip: use namedtuple instead of manually created classes
  32. Python - poetry(3)配置项详解
  33. Python - poetry(3)配置项详解
  34. Python - poetry(3)配置項詳解
  35. Python - poetry(3)配置項詳解
  36. Python - détails de l'élément de configuration Poetry (3)
  37. Python - détails de l'élément de configuration Poetry (3)
  38. Python案例实战,pygame模块,Python实现字母代码雨
  39. Python calculation vector angle code
  40. Python基础面试题解读|《Python面试100层》|第1层
  41. 面对小白的pandas命令手册+练习题【三万字详解】
  42. 面對小白的pandas命令手册+練習題【三萬字詳解】
  43. Face au Manuel de commande pandas de Xiaobai + question d'exercice [30 000 mots pour plus de détails]
  44. Interprétation des questions d'entrevue de base Python | 100 couches d'entrevue Python | couche 1
  45. Python data structure and algorithm (17) -- merge sort
  46. Les fonctions intégrées Python exécutent des blocs de code de fonction à travers des chaînes, et les mécanismes de réflexion comme Java sont assez puissants!
  47. Python笔记-uiautomator2截图点击,OpenCV找图
  48. Python文档阅读笔记-OpenCV中Template Matching
  49. Python笔记-利用OpenCV的matchTemplate屏幕找图并使用pyautogui点击
  50. Python筆記-利用OpenCV的matchTemplate屏幕找圖並使用pyautogui點擊
  51. Notes python - utilisez l'écran matchtemplate d'OpenCV pour trouver des images et cliquez sur
  52. Notes de lecture de documents python - Matching de modèles dans OpenCV
  53. Notes python - capture d'écran de l'automate 2 Cliquez pour ouvrir la vue
  54. python链接云服务器的mysql8
  55. python鏈接雲服務器的mysql8
  56. Mysql8 pour les serveurs Cloud liés Python
  57. Python资源大集合,要的话可以拿走!
  58. ️万字【Python基础】保姆式教学️,小白快速入门Python!
  59. ️萬字【Python基礎】保姆式教學️,小白快速入門Python!
  60. Wanzi [base Python] Baby - sitting Teaching, Little White Quick Start Python!