Heim >Backend-Entwicklung >Python-Tutorial >Lassen Sie uns über gängige magische Methoden in Python sprechen

Lassen Sie uns über gängige magische Methoden in Python sprechen

王林
王林nach vorne
2023-05-15 22:34:04955Durchsuche

​Was ist die magische Methode?

Magische Methoden sind in Python integrierte Funktionen, die normalerweise mit doppelten Unterstrichen beginnen und enden, wie z. B. __init__, __del__ usw. Sie werden magische Methoden genannt, weil sie automatisch aufgerufen werden, wenn bestimmte Operationen ausgeführt werden.

In Python können Sie die Methode dir() verwenden, um alle Methoden und Attribute eines Objekts anzuzeigen. Diejenigen, die mit doppelten Unterstrichen beginnen und enden, sind die magischen Methoden des Objekts. Nehmen Sie das String-Objekt als Beispiel:

>>> 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']

Sie können sehen, dass das String-Objekt über die Methode __add__ verfügt, sodass Sie die Operation „+“ direkt für das String-Objekt in Python verwenden können Ruft die __add__-Methode des Objekts auf. Bei Bedarf können wir die Methode __add__ in unserer eigenen Klasse überschreiben, um den gewünschten Effekt zu erzielen.

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"

Wir haben die __add__-Methode neu geschrieben. Wenn Python die „+“-Operation erkennt, ruft es automatisch die neu geschriebene __add__-Methode auf. Wie Sie sehen, werden magische Methoden automatisch ausgeführt, nachdem bestimmte Ereignisse der Klasse oder des Objekts ausgelöst wurden. Wenn Sie eine Klasse mit speziellen Funktionen an Ihr eigenes Programm anpassen möchten, müssen Sie diese Methoden neu schreiben. Mit magischen Methoden können wir Klassen sehr bequem spezielle Funktionen hinzufügen.

Häufig verwendete magische Methoden

1. Konstruktion und Initialisierung

__new__, __init__ Diese beiden magischen Methoden werden häufig zum Initialisieren von Klassen verwendet. Als wir oben a1 = A("hello") erstellt haben, war das erste, was wir aufgerufen haben, __new__; die Initialisierung einer Klasse ist in zwei Schritte unterteilt:

  • a Rufen Sie die neue Methode der Klasse auf und geben Sie das Instanzobjekt der Klasse zurück
  • b .Rufen Sie die Init-Methode der Klasse auf, um das Instanzobjekt zu initialisieren

__new__(cls, *args, **kwargs) erfordert mindestens einen cls-Parameter, der die eingehende Klasse darstellt. Die letzten beiden Parameter werden an __init__ übergeben. In __new__ können Sie entscheiden, ob Sie die Methode __init__ weiterhin aufrufen möchten. Nur wenn __new__ eine Instanz der aktuellen Klasse cls zurückgibt, wird __init__ aufgerufen. In Kombination mit den Eigenschaften der __new__-Methode können wir den Singleton-Modus von Python implementieren, indem wir die __new__-Methode überschreiben:

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>)

Sie können sehen, dass, obwohl zwei Objekte erstellt werden, die Adressen der beiden Objekte gleich sind.

2. Magische wie die Steuerung des Attributzugriffs

Methoden funktionieren hauptsächlich beim Zugriff, Definieren und Ändern der Eigenschaften eines Objekts. Die wichtigsten sind:

  • __getattr__(self, name): Definieren Sie das Verhalten, wenn der Benutzer versucht, ein Attribut abzurufen.
  • __getattribute__(self, name): Definieren Sie das Verhalten, wenn auf das Attribut dieser Klasse zugegriffen wird (rufen Sie zuerst diese Methode auf, um zu sehen, ob das Attribut vorhanden ist. Wenn nicht, rufen Sie dann getattr auf).
  • __setattr__(self, name, value): Definiert das Verhalten, wenn ein Attribut gesetzt wird.

Die magische Methode self.__setattr__(name, Values) wird aufgerufen, wenn Attribute wie self.a=a initialisiert oder Instanzattribute wie ins.a=1 geändert werden; wenn die Instanz auf ein Attribut wie ins.a zugreift ist der Aufruf der magischen Methode a.__getattr__(name)

3. Containerklassenoperationen

Es gibt einige Methoden, mit denen wir unsere eigenen Container definieren können, wie z. B. die in Python integrierten List-, Tuple-, Dict-Container unterteilt in variable Container und unveränderliche Container.

Wenn Sie einen unveränderlichen Container anpassen, können Sie nur __len__ und __getitem__ definieren. Zusätzlich zu allen magischen Methoden des unveränderlichen Containers müssen Sie auch __setitem__ und __delitem__ definieren. Sie müssen auch __iter__ definieren.

  • __len__(self): Gibt die Länge des Containers zurück
  • __getitem__(self,key): Wenn Sie self[key] ausführen müssen, um das Objekt im Container aufzurufen, heißt diese Methode __setitem__(self,key, value) :Wenn Sie self[key] = value ausführen müssen, wird diese Methode aufgerufen
  • __iter__(self):Wenn der Container für x in Container: ausgeführt werden kann oder iter(container) verwendet werden kann, müssen Sie diese Methode definieren

unten Implementieren Sie beispielsweise einen Container mit den allgemeinen Funktionen einer Liste und fügen Sie gleichzeitig einige andere Funktionen hinzu, z. B. den Zugriff auf das erste Element, das letzte Element, das Aufzeichnen der Anzahl der Zugriffe auf jedes Element usw.

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]

Das Verwendungsszenario dieser Methode wird hauptsächlich verwendet, wenn Sie eine Containerklassen-Datenstruktur definieren müssen, die Ihren Anforderungen entspricht. Sie können beispielsweise versuchen, Datenstrukturen wie Baumstrukturen und verknüpfte Listen (alle) anzupassen sind bereits in Sammlungen verfügbar) oder einige Containertypen, die im Projekt angepasst werden müssen.

Zusammenfassung

Magische Methoden können den Code vereinfachen und die Lesbarkeit des Codes im Python-Code verbessern. Sie können viele Anwendungen magischer Methoden in gängigen Python-Bibliotheken von Drittanbietern sehen. Daher ist dieser aktuelle Artikel nur eine Einführung. Der tatsächliche Einsatz erfordert eine kontinuierliche Vertiefung des Verständnisses und eine angemessene Anwendung im hervorragenden Open-Source-Quellcode und in der eigenen Ingenieurpraxis.

Das obige ist der detaillierte Inhalt vonLassen Sie uns über gängige magische Methoden in Python sprechen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen