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

Parlons des méthodes magiques courantes en Python

王林
Libérer: 2023-05-15 22:34:04
avant
951 Les gens l'ont consulté

​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']
Copier après la connexion

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"
Copier après la connexion

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>)
Copier après la connexion

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]
Copier après la connexion

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!

Étiquettes associées:
source:51cto.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal