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

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

これら 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__())
# [<class '__main__.Dog'>, <class '__main__.Cat'>]
ログイン後にコピー

ただし、.__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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート