Ich habe aus diesen 7 Fragen etwas gewonnen, die wie folgt zusammengefasst sind:
Sie kennen vielleicht die magischen Funktionen in Python, wie __add__ und __sub__, die den +-Operator darstellen, der obj darstellt +/ - etwas, aber Sie wissen vielleicht nicht, dass es auch eine Funktion __radd__, __rsub__ gibt, die etwas +/- obj darstellen kann.
Beispiele sind wie folgt:
class Dog: def __add__(self, other): return "from __add__" def __radd__(self, other): return "from __radd__" dog = Dog() print(dog + 1) # from __add__ print(1 + dog) # from __radd__
__getattr__ Die magische Methode wird nur aufgerufen, wenn wir versuchen, ein Attribut abzurufen, das nicht existiert, __getattribute__ wird jedes Mal aufgerufen, wenn wir versuchen, auf ein Attribut zuzugreifen .
Der Code lautet wie folgt:
class Dog: def __init__(self, name, age): self.name = name self.age = age def __getattr__(self, key): return f"{key} not found" dog = Dog("taidi", 5) print(dog.name)# taidi print(dog.age) # 5 print(dog.breed) # breed not found
class Dog: def __init__(self, name, age): self.name = name self.age = age def __getattribute__(self, key): return f"{key} not found" dog = Dog("taidi", 5) print(dog.name)# name not found print(dog.age) # age not found print(dog.breed) # breed not found
class Animal: def __init__(self, name, age): self.name = name self.age = age class Dog(Animal): def __init__(self, name, age, breed): super().__init__(name, age) self.breed = breed
ist äquivalent zu:
class Animal: def __init__(self, name, age): self.name = name self.age = age class Dog(Animal): def __init__(self, name, age, breed): Animal.__init__(self, name, age) self.breed = breed
Bitte beachten Sie, dass Animal.__init__(self, name, age) nicht fehlen darf der self-Parameter.
class Animal: pass class Dog(Animal): pass class Cat(Animal): pass class GermanSheperd(Dog): pass print(Animal.__subclasses__()) # [<class '__main__.Dog'>, <class '__main__.Cat'>]
Allerdings kann .__subclasses__() nur direkte Unterklassen prüfen.
class A: def test(self): print("A") class B: def test(self): print("B") class C(A, B): pass C().test() # A
A und B haben beide Testmethoden. Welche integriert C also? In Python hat die Klasse ganz links Vorrang.
Hier ist A die übergeordnete Klasse ganz links, daher ist die Testmethode von A integriert.
Mehrfacheinzahlungen sind weiterhin verwirrend, daher ist es besser, sie nicht zu nutzen.
class Dog: def __invert__(self): return "test" dog = Dog() print(~dog) # test
~ Der Operator steht für „bitweise nicht“ und wird normalerweise zum Invertieren von Inhalten verwendet. Ein aussagekräftigeres Beispiel ist wie folgt:
class Coordinate: def __init__(self, x, y): self.x = x self.y = y def __str__(self): return f"({self.x}, {self.y})" def __invert__(self): return Coordinate(-self.x, -self.y) a = Coordinate(3, 4) b = ~a print(a, b) # (3, 4) (-3, -4)
def init(self, name, age): self.name = name self.age = age def bark(self): print("woof") Dog = type("Dog", (), {"__init__":init, "bark":bark}) dog = Dog("taidi", 10) print(dog.name) print(dog.age) # taidi # 10
Hier übergeben wir 3 Parameter an type, um unsere Klasse zu erstellen.
Der erste Parameter __name__ ist der Name der Klasse. Der zweite Parameter __bases__ ist ein Tupel, das die übergeordnete Klasse enthält. Der dritte Parameter __dict__ ist ein Wörterbuch, das Attribute und Methoden enthält.
Entspricht:
class Dog: def __init__(self, name, age): self.name = name self.age = age def bark(self): print("woof")
Das obige ist der detaillierte Inhalt vonSieben Python-Fragen zur Verbesserung der Lese- und Schreibfähigkeit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!