Maison >développement back-end >Tutoriel Python >Parlons des méthodes magiques courantes en Python

Parlons des méthodes magiques courantes en Python

王林
王林avant
2023-05-15 22:34:04952parcourir

​Quelle est la méthode magique ?

Les méthodes magiques sont des fonctions intégrées à Python, commençant et se terminant généralement par des traits de soulignement doubles, tels que __init__, __del__, etc. On les appelle méthodes magiques car elles sont automatiquement appelées lors de l’exécution d’opérations spécifiques.

En Python, vous pouvez utiliser la méthode dir() pour afficher toutes les méthodes et attributs d'un objet. Ceux commençant et se terminant par des doubles traits de soulignement sont les méthodes magiques de l'objet. Prenons l'exemple de l'objet chaîne :

>>> dir("hello")
['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mo
d__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center',
'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'isl
ower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', '
rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate'
, 'upper', 'zfill']

Vous pouvez voir que l'objet chaîne a la méthode __add__, vous pouvez donc utiliser directement l'opération "+" sur l'objet chaîne en Python. Lorsque Python reconnaît l'opération "+", il. appellera la méthode __add__ de l'objet. Si nécessaire, nous pouvons remplacer la méthode __add__ dans notre propre classe pour obtenir l'effet souhaité.

class A(object):
def __init__(self, str):
self.str = str


• def __add__(self, other):
• print ('overwrite add method')
• return self.str + "---" + other.str


>>>a1 = A("hello")
>>>a2 = A("world")
>>>print (a1 + a2)
>>>overwrite add method
>>>"hello---world"

Nous avons réécrit la méthode __add__. Lorsque Python reconnaît l'opération "+", il appellera automatiquement la méthode __add__ réécrite. Comme vous pouvez le voir, les méthodes magiques seront automatiquement exécutées après le déclenchement de certains événements de la classe ou de l'objet. Si vous souhaitez personnaliser une classe avec des fonctions spéciales selon votre propre programme, vous devez réécrire ces méthodes. En utilisant des méthodes magiques, nous pouvons ajouter des fonctions spéciales aux classes de manière très pratique.

Méthodes magiques couramment utilisées

1. Construction et initialisation

__new__, __init__ Ces deux méthodes magiques sont souvent utilisées pour initialiser les classes. Lorsque nous avons créé a1 = A("hello") ci-dessus, la première chose que nous avons appelée était __new__ ; l'initialisation d'une classe est divisée en deux étapes :

  • a Appelez la nouvelle méthode de la classe et renvoyez l'objet instance de la classe.
  • b .Appelez la méthode init de la classe pour initialiser l'objet instance

__new__(cls, *args, **kwargs) nécessite au moins un paramètre cls, représentant la classe entrante. Les deux derniers paramètres sont transmis à __init__. Dans __new__, vous pouvez décider de continuer à appeler la méthode __init__. Ce n'est que lorsque __new__ renvoie une instance de la classe actuelle cls que __init__ sera appelé. Combiné avec les caractéristiques de la méthode __new__, nous pouvons implémenter le mode singleton de Python en remplaçant la méthode __new__ :

class Singleton(object):
def __init__(self):
print("__init__")

• def __new__(cls, *args, **kwargs):
• print("__new__")
• if not hasattr(Singleton, "_instance"):
• print("创建新实例")
• Singleton._instance = object.__new__(cls)
• return Singleton._instance

>>> obj1 = Singleton()
>>> __new__
>>> 创建新实例
>>> __init__
>>> obj2 = Singleton()
>>> __new__
>>> __init__
>>> print(obj1, obj2)
>>> (<__main__.Singleton object at 0x0000000003599748>, <__main__.Singleton object at 0x0000000003599748>)

Vous pouvez voir que bien que deux objets soient créés, les adresses des deux objets sont les mêmes.

2. Les méthodes magiques comme le contrôle de l'accès aux attributs

fonctionnent principalement lors de l'accès, de la définition et de la modification des propriétés d'un objet. Les principaux sont :

  • __getattr__(self, name) : Définit le comportement lorsque l'utilisateur tente d'obtenir un attribut.
  • __getattribute__(self, name) : définissez le comportement lors de l'accès à l'attribut de cette classe (appelez d'abord cette méthode pour voir si l'attribut existe, sinon, appelez getattr).
  • __setattr__(self, name, value) : définit le comportement lorsqu'un attribut est défini.

La méthode magique self.__setattr__(name, values) est appelée lors de l'initialisation d'attributs tels que self.a=a ou de la modification d'attributs d'instance tels que ins.a=1 lorsque l'instance accède à un attribut tel que ins.a It ; consiste à appeler la méthode magique a.__getattr__(name)

3. Opérations de classe conteneur

Il existe certaines méthodes qui nous permettent de définir nos propres conteneurs, comme les conteneurs List, Tuple, Dict, etc. divisé en conteneurs variables et conteneurs immuables.

Si vous personnalisez un conteneur immuable, vous ne pouvez définir que __len__ et __getitem__ ; pour définir un conteneur mutable, en plus de toutes les méthodes magiques du conteneur immuable, vous devez également définir __setitem__ et __delitem__ si le conteneur est itérable. Vous devez également définir __iter__.

  • __len__(self) : renvoie la longueur du conteneur
  • __getitem__(self,key) : Lorsque vous devez exécuter self[key] pour appeler l'objet dans le conteneur, cette méthode est appelée __setitem__(self,key, value) :Lorsque vous devez exécuter self[key] = value, cette méthode est appelée
  • __iter__(self) :Lorsque le conteneur peut s'exécuter pour x dans conteneur :, ou utiliser iter(container), vous devez définir cette méthode

ci-dessous Par exemple, implémentez un conteneur qui a les fonctions générales d'une liste, tout en ajoutant d'autres fonctions telles que l'accès au premier élément, au dernier élément, l'enregistrement du nombre de fois où chaque élément a été accédé, etc.

class SpecialList(object):
def __init__(self, values=None):
self._index = 0
if values is None:
self.values = []
else:
self.values = values
self.count = {}.fromkeys(range(len(self.values)), 0)

def __len__(self):# 通过len(obj)访问容器长度
return len(self.values)

def __getitem__(self, key):# 通过obj[key]访问容器内的对象
self.count[key] += 1
return self.values[key]

def __setitem__(self, key, value):# 通过obj[key]=value去修改容器内的对象
self.values[key] = value

def __iter__(self):# 通过for 循环来遍历容器
return iter(self.values)

def __next__(self):
# 迭代的具体细节
# 如果__iter__返回时self 则必须实现此方法
if self._index >= len(self.values):
raise StopIteration()
value = self.values[self._index]
self._index += 1
return value

def append(self, value):
self.values.append(value)

def head(self):
# 获取第一个元素
return self.values[0]

def last(self):
# 获取最后一个元素
return self.values[-1]

Le scénario d'utilisation de cette méthode est principalement utilisé lorsque vous devez définir une structure de données de classe conteneur qui répond à vos besoins. Par exemple, vous pouvez essayer de personnaliser des structures de données telles que des structures arborescentes et des listes chaînées (toutes ces structures). sont déjà disponibles dans les collections), ou certains types de conteneurs qui doivent être personnalisés dans le projet.

Résumé

Les méthodes magiques peuvent simplifier le code et améliorer la lisibilité du code dans le code Python. Vous pouvez voir de nombreuses applications des méthodes magiques dans les bibliothèques tierces Python courantes. Par conséquent, cet article n'est qu'une introduction. L'utilisation réelle nécessite un approfondissement continu de la compréhension et une application appropriée de l'excellent code source open source et de sa propre pratique d'ingénierie.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer