J'ai appris quelque chose de ces 7 questions, qui se résument comme suit :
Vous connaissez peut-être les fonctions magiques en Python, telles que __add__ et __sub__ qui représentent l'opérateur + -, qui représente obj. +/ - quelque chose, mais vous ne savez peut-être pas qu'il existe également une fonction __radd__, __rsub__, qui peut représenter quelque chose +/- obj.
Les exemples sont les suivants :
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__ La méthode magique ne sera appelée que lorsque nous essaierons d'obtenir un attribut qui n'existe pas, __getattribute__ sera appelée à chaque fois que nous essaierons d'accéder à un attribut. .
Le code est le suivant :
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
est équivalent à :
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
Veuillez noter que Animal.__init__(self, name, age) ne peut pas manquer. le paramètre self .
class Animal: pass class Dog(Animal): pass class Cat(Animal): pass class GermanSheperd(Dog): pass print(Animal.__subclasses__()) # [<class '__main__.Dog'>, <class '__main__.Cat'>]
Cependant, .__subclasses__() ne peut vérifier que les sous-classes directes.
class A: def test(self): print("A") class B: def test(self): print("B") class C(A, B): pass C().test() # A
A et B ont tous deux des méthodes de test, alors laquelle C intègre-t-il ? En Python, la classe la plus à gauche est prioritaire.
Ici, A est la classe parent la plus à gauche, donc la méthode de test de A est intégrée.
Les dépôts multiples continuent de prêter à confusion, il est donc préférable de ne pas les utiliser.
class Dog: def __invert__(self): return "test" dog = Dog() print(~dog) # test
~ L'opérateur signifie "bitwise not" et est généralement utilisé pour inverser le contenu. Un exemple plus significatif est le suivant :
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
Ici, nous passons 3 paramètres à saisir pour créer notre classe.
Le premier paramètre __name__ est le nom de la classe. Le deuxième paramètre __bases__ est un tuple contenant la classe parent. Le troisième paramètre __dict__ est un dictionnaire contenant des attributs et des méthodes.
Équivalent à :
class Dog: def __init__(self, name, age): self.name = name self.age = age def bark(self): print("woof")
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!