Python - Programmation orientée objet - réflexion hasattr, GetAttr, GetAttr, delattr

python programmation orient objet flexion


Qu'est - ce que le réflexe?

Le concept de réflexion est défini par Smith In 1982 Présenté pour la première fois en,Cela signifie principalement que le programme est accessible、La capacité de détecter et de modifier son propre état ou son propre comportement(Introspection)

Python Réflexion dans un objet orienté

  • Manipulation des propriétés de l'objet sous forme de chaîne
  • Python Tout est un objet,Donc vous pouvez utiliser la réflexion aussi longtemps que vous êtes un objet
  • Par exemple,:Objet instance、Objet de classe、Ce module、Autres modules,Parce qu'ils peuvent tous passer Comment obtenir、Appelez

Objet.Propriétés

Quatre fonctions clés dans la réflexion

  • hasattr
  • getattr
  • setattr
  • delattr

hasattr

def hasattr(*args, **kwargs):
"""
Return whether the object has an attribute with the given name.
This is done by calling getattr(obj, name) and catching AttributeError.
"""
pass
  • Renvoie si l'objet a une propriété avec le nom donné
  • C'est en appelant Et capturerAttributeErrorPour finir

getattr(obj,name)

getattr

def getattr(object, name, default=None):
"""
getattr(object, name[, default]) -> value
Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
When a default argument is given, it is returned when the attribute doesn't
exist; without it, an exception is raised in that case.
"""
pass
  • Obtient les propriétés du nom spécifié de l'objet
  • Équivalent écrit x.y

getattr(x , y)

  • Quand la propriété n'existe pas ,Renvoie default Valeur,Si ce n'est pas spécifié default Une exception est lancée

setattr

def setattr(x, y, v):
"""
Sets the named attribute on the given object to the specified value.
setattr(x, 'y', v) is equivalent to ``x.y = v''
"""
pass
  • Définir la propriété spécifiée à la valeur de l'objet spécifié
  • Équivalent écrit x.y = v

setattr(x,y,v)

delattr

def delattr(x, y):
"""
Deletes the named attribute from the given object.
delattr(x, 'y') is equivalent to ``del x.y''
"""
pass
  • Supprimer l'attribut spécifié de l'objet spécifié
  • Équivalent écrit del x.y

delattr(x,y)

Membres de la classe de réflexion

class PoloBlog:
sum = 0
def __init__(self, name):
self.name = name
def test(self):
print("====Nom==== ", self.name)

hasattr

blog = PoloBlog("Petit ananas")
# hasattr
print(hasattr(blog, "name")) # Objet instance-Propriétés de l'Instance
print(hasattr(blog, "sum")) # Objet instance-Propriétés de la classe
print(hasattr(PoloBlog, "sum")) # Objet de classe-Propriétés de la classe
print(hasattr(PoloBlog, "name")) # Objet de classe-Propriétés de l'Instance
# Résultats obtenus
True
True
True
False

getattr

# getattr
print(getattr(blog, "name")) # Objet instance-Propriétés de l'Instance
print(getattr(blog, "sum")) # Objet instance-Propriétés de la classe
print(getattr(PoloBlog, "sum")) # Objet de classe-Propriétés de la classe
print(getattr(PoloBlog, "name", "Par défaut")) # Objet de classe-Propriétés de l'Instance
# Résultats obtenus
Petit ananas
0
0
Par défaut

setattr

# Définir une nouvelle propriété d'instance
setattr(blog, "age", 24)
# Définir une nouvelle méthode d'instance
setattr(blog, "printNameAge", lambda self: f"Nom:{self.name} Âge:{self.age}")
print(blog.__dict__)
print(blog.printNameAge(blog))
# Résultats obtenus
{'name': 'Petit ananas', 'age': 24, 'printNameAge': <function <lambda> at 0x10391a1f0>}
Nom:Petit ananas Âge:24

delattr

# delattr
delattr(blog, "age")
delattr(blog, "printNameAge")
print(blog.__dict__)
# Résultats obtenus
{'name': 'Petit ananas'}

Refléter les membres de ce module

En plus de pouvoir détecter un attribut dans la classe 、Méthodes, Peut également être utilisé pour détecter s'il y a une méthode sous un module 、Catégorie、Variables

sums = 0
def test1():
print("test")
class A():
pass
this_module = sys.modules[__name__]
print(__name__)
print(this_module)
print(hasattr(this_module, "sums")) # Variables
print(hasattr(this_module, "test1")) # Méthodes
print(hasattr(this_module, "A")) # Catégorie
# Résultats obtenus
__main__
<module '__main__' from '/Users/polo/Documents/pylearn/Chapitre IV:Orienté objet/22_Réflexe.py'>
True
True
True

Refléter les membres d'autres modules

Résultats obtenus

True
Réflexe22222
Petit ananas 

fanshe C'est un autre module

Application de la réflexion I

Besoins

  • Ouvrir le Navigateur, Visiter un site Web
  • Cliquez sur login pour passer à l'interface login
  • Cliquez sur inscription pour passer à l'interface d'inscription
  • Cliquez sur un lien après l'autre , Chaque lien a une fonction ou une méthode pour gérer

Avant réflexion non utilisée

class Web:
def login(self):
print(' Bienvenue sur la page de connexion ')
def register(self):
print(' Bienvenue à la page d'inscription ')
def save(self):
print(' Bienvenue à la page de stockage ')
while True:
obj = Web()
choose = input(">>>").strip()
if choose == 'login':
obj.login()
elif choose == 'register':
obj.register()
elif choose == 'save':
obj.save()

Après réflexion

class Web:
def login(self):
print(' Bienvenue sur la page de connexion ')
def register(self):
print(' Bienvenue à la page d'inscription ')
def save(self):
print(' Bienvenue à la page de stockage ')
while True:
obj = Web()
choose = input(">>>").strip()
# Déterminer si l'objet a une méthode correspondante
if hasattr(obj, choose):
# Obtenir la méthode correspondante
f = getattr(obj, choose)
# Méthode d'exécution
f()

Application de la réflexion II

Lors des tests d'automatisation des interfaces , D'habitude, on emballe BaseRequest Classe pour le multiplexage , Les différentes méthodes de demande sont encapsulées dans la classe

Avant réflexion non utilisée

class BaseRequest:
req = requests.Session()
def get(self, url):
resp = self.req.get(url)
print("==get==")
return resp
def post(self, url):
resp = self.req.post(url)
print("==post==")
return resp
def put(self, url):
resp = self.req.put(url)
print("==put==")
return resp
# Ne pas utiliser la méthode de réflexion
def main(self, method, url):
if method == "get":
self.get(url)
elif method == "post":
self.post(url)
elif method == "put":
self.put(url)

Après réflexion

 # En utilisant la méthode de réflexion
def main_attr(self, method, url):
if hasattr(self, method):
func = getattr(self, method)
func(url)

Code d'exécution

request = BaseRequest()
# Pas de réflexion
request.main("get", "http://www.baidu.com")
request.main("post", "http://www.baidu.com")
request.main("put", "http://www.baidu.com")
# Utiliser la réflexion
request.main_attr("get", "http://www.baidu.com")
request.main_attr("post", "http://www.baidu.com")
request.main_attr("put", "http://www.baidu.com")
# Résultats obtenus
==get==
==post==
==put==
==get==
==post==
==put==

Résumé

Quand plusieurs méthodes sont encapsulées , Et quand vous avez besoin d'appeler différentes méthodes selon différentes conditions , On pourrait envisager d'utiliser des réflexes , Une petite quantité de code n'est pas un point et demi

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/20210914180056932f.html

  1. Take you to learn more about nginx basic login authentication: generating passwords using Python
  2. 超硬核Python避坑学习方案奉上!入门到就业一篇就搞定!
  3. Talk about how JMeter executes Python scripts concurrently
  4. Talk about how JMeter executes Python scripts concurrently
  5. Talk about how JMeter executes Python scripts concurrently
  6. python内置函数通过字符串的方式来执行函数代码块,类似java的反射机制相当强大!
  7. python内置函数通过字符串的方式来执行函数代码块,类似java的反射机制相当强大!
  8. python內置函數通過字符串的方式來執行函數代碼塊,類似java的反射機制相當强大!
  9. 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!
  10. Python module 1
  11. Python tip: use namedtuple instead of manually created classes
  12. Python - poetry(3)配置项详解
  13. Python - poetry(3)配置项详解
  14. Python - poetry(3)配置項詳解
  15. Python - poetry(3)配置項詳解
  16. Python - détails de l'élément de configuration Poetry (3)
  17. Python - détails de l'élément de configuration Poetry (3)
  18. Python案例实战,pygame模块,Python实现字母代码雨
  19. Python calculation vector angle code
  20. Python基础面试题解读|《Python面试100层》|第1层
  21. 面对小白的pandas命令手册+练习题【三万字详解】
  22. 面對小白的pandas命令手册+練習題【三萬字詳解】
  23. Face au Manuel de commande pandas de Xiaobai + question d'exercice [30 000 mots pour plus de détails]
  24. Interprétation des questions d'entrevue de base Python | 100 couches d'entrevue Python | couche 1
  25. Python data structure and algorithm (17) -- merge sort
  26. 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!
  27. Python笔记-uiautomator2截图点击,OpenCV找图
  28. Python文档阅读笔记-OpenCV中Template Matching
  29. Python笔记-利用OpenCV的matchTemplate屏幕找图并使用pyautogui点击
  30. Python筆記-利用OpenCV的matchTemplate屏幕找圖並使用pyautogui點擊
  31. Notes python - utilisez l'écran matchtemplate d'OpenCV pour trouver des images et cliquez sur
  32. Notes de lecture de documents python - Matching de modèles dans OpenCV
  33. Notes python - capture d'écran de l'automate 2 Cliquez pour ouvrir la vue
  34. python链接云服务器的mysql8
  35. python鏈接雲服務器的mysql8
  36. Mysql8 pour les serveurs Cloud liés Python
  37. Python资源大集合,要的话可以拿走!
  38. ️万字【Python基础】保姆式教学️,小白快速入门Python!
  39. ️萬字【Python基礎】保姆式教學️,小白快速入門Python!
  40. Wanzi [base Python] Baby - sitting Teaching, Little White Quick Start Python!
  41. Realizing the function of sending e-mail automatically with Python
  42. Smtpauthenticationerror in Python: solution
  43. 8 steps to teach you how to solve Sudoku in Python! (including source code)
  44. Python change la vie | identifier facilement des centaines de numéros de livraison
  45. Python change life | utilisation de modèles reconnus par ocr
  46. Bibliothèques Python utiles et intéressantes - - psutil
  47. 3. Traitement des données pandas
  48. 【Python编程基础】控制流之链式比较运算符
  49. MFC uses Python scripting language
  50. 【Python編程基礎】控制流之鏈式比較運算符
  51. 【 base de programmation python】 opérateur de comparaison de chaîne pour le flux de contrôle
  52. Python game development, pyGame module, python implementation of Xiaole games
  53. Mise en œuvre du Code de vérification unique (OTP) avec le cadre de repos Django
  54. Python - eval ()
  55. Python - Programmation orientée objet - _Rapport()
  56. Différence entre python - rep (), Str ()
  57. Python - Programmation orientée objet - _Appel()
  58. Python calling matlab script
  59. Python - Programmation orientée objet - _Nouveau() et mode Singleton
  60. Python - Programmation orientée objet - méthode magique (méthode de double soulignement)