Saya belajar sesuatu daripada 7 soalan ini, yang diringkaskan seperti berikut:
Anda mungkin tahu fungsi ajaib dalam Python, seperti __add__ dan __sub__. Mewakili operator + -, yang mewakili obj +/- sesuatu, tetapi anda mungkin tidak tahu bahawa terdapat juga fungsi __radd__, __rsub__, yang boleh mewakili sesuatu +/- obj.
Contohnya:
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__ Kaedah ajaib hanya akan dipanggil apabila kita cuba mendapatkan atribut yang tidak wujud, __getattribute__ dalam Ia akan dipanggil setiap kali kami cuba mengakses harta itu.
Kodnya adalah seperti berikut:
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
bersamaan dengan:
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
Sila ambil perhatian bahawa Animal.__init__(diri, nama, umur) tidak boleh kehilangan parameter diri.
class Animal: pass class Dog(Animal): pass class Cat(Animal): pass class GermanSheperd(Dog): pass print(Animal.__subclasses__()) # [<class '__main__.Dog'>, <class '__main__.Cat'>]
Walau bagaimanapun, .__subclasses__() hanya boleh menyemak subclass langsung.
class A: def test(self): print("A") class B: def test(self): print("B") class C(A, B): pass C().test() # A
A dan B kedua-duanya mempunyai kaedah ujian, jadi yang manakah C disepadukan? Dalam Python, kelas paling kiri diutamakan.
Di sini, A ialah kelas induk paling kiri, jadi kaedah ujian A disepadukan.
Caj semula berbilang masih mengelirukan, jadi sebaiknya jangan gunakannya.
class Dog: def __invert__(self): return "test" dog = Dog() print(~dog) # test
~ operator bermaksud "bitwise NOT" dan biasanya digunakan untuk menyongsangkan kandungan. Contoh yang lebih bermakna adalah seperti berikut:
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
Di sini, kami lulus 3 parameter untuk menaip bagi mencipta kelas kami.
Parameter pertama __name__ ialah nama kelas Parameter kedua __bases__ ialah tuple yang mengandungi kelas induk Parameter ketiga __dict__ ialah kamus yang mengandungi atribut dan kaedah.
bersamaan dengan:
class Dog: def __init__(self, name, age): self.name = name self.age = age def bark(self): print("woof")
Atas ialah kandungan terperinci Tujuh soalan Python untuk meningkatkan celik huruf. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!