リテラシーを向上させるための 7 つの Python の質問

WBOY
リリース: 2023-04-11 16:52:03
転載
1688 人が閲覧しました

これら 7 つの質問から私は何かを得ることができました。要約すると次のようになります:

1. 反射算術演算子

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__
ログイン後にコピー

2. __getattr__ と __getattribute__

__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
ログイン後にコピー

3. super().__init__() を記述する別の方法

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 パラメータを省略できないことに注意してください。

4. サブクラスの確認方法

class Animal: pass class Dog(Animal): pass class Cat(Animal): pass class GermanSheperd(Dog): pass print(Animal.__subclasses__()) # [, ]
ログイン後にコピー

ただし、.__subclasses__() で確認できるのは直接のサブクラスのみです。

5. 複数の統合を使用する場合、同じ名前のどの関数をサブクラスで使用する必要がありますか?

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 のテスト メソッドが統合されます。

複数のリチャージは混乱を招くため、使用しないほうがよいでしょう。

6 __invert__ マジック関数

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)
ログイン後にコピー

7. class を使用せずにクラスを作成する

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:51cto.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!