これら 7 つの質問から私は何かを得ることができました。要約すると次のようになります:
Python の魔法の関数 (__add__ や __sub__ など) についてはご存知かもしれません。 /- obj を表す - 演算子を表しますが、/- obj を表す __radd__、__rsub__ 関数もあることはご存知ないかもしれません。
例:
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__ マジック メソッドは、存在しない属性を取得しようとした場合にのみ呼び出されます。毎回呼び出されます これは、プロパティにアクセスしようとするたびに呼び出されます。
コードは次のとおりです:
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
は次と同等です:
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
Animal.__init__(self, name, age) には 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'>]
ただし、.__subclasses__() で確認できるのは直接のサブクラスのみです。
class A: def test(self): print("A") class B: def test(self): print("B") class C(A, B): pass C().test() # A
A と B には両方ともテスト メソッドがありますが、C ではどちらを統合しますか? Python では、左端のクラスが優先されます。
ここでは、A が一番左の親クラスなので、A のテスト メソッドが統合されます。
複数のリチャージは混乱を招くため、使用しないほうがよいでしょう。
class Dog: def __invert__(self): return "test" dog = Dog() print(~dog) # test
~ 演算子は「ビット単位の否定」を表し、通常は内容を反転するために使用されます。より意味のある例は次のとおりです:
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
ここでは、3 つのパラメーターを type に渡してクラスを作成します。
最初のパラメータ __name__ はクラスの名前です。2 番目のパラメータ __bases__ は親クラスを含むタプルです。3 番目のパラメータ __dict__ は属性とメソッドを含む辞書です。
と同等:
class Dog: def __init__(self, name, age): self.name = name self.age = age def bark(self): print("woof")
以上がリテラシーを向上させるための 7 つの Python の質問の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。