Python の魔法のメソッド (2)

__getattr__()

class A:
	def __getattr__(self,name):
        print(f"getting {
      
      name}")
        raise AttributeError

o = A()
print(o.test)

プログラムはオブジェクトのプロパティを呼び出します。プロパティが存在しない場合にプログラムに何をさせたいですか。ここでは、目的のプロパティを出力して例外をスローします。

__getattribute__()

class A:
    def __init__(self):
        self.exist = True

    def __getattribute__(self, item):
        print(f"getting {
      
      item}")
        return None
    
o = A()
print(o.exist)
print(o.test)

このメソッドは、オブジェクトのプロパティを読み取ろうとするたびに呼び出されます。上記のデモでは、読み取られるプロパティが存在するかどうかに関係なく、このメソッドが呼び出されることが示されています。

class A:
    def __init__(self):
        self.exist = True
        self.counter = 0

    def __getattribute__(self, item):
        if item == 'exist':
            self.counter += 1
        return super().__getattribute__(item)

o = A()
print(o.exist)
print(o.counter)

ここでは、マジック メソッドの戻り値中にメソッドを直接呼び出すことはできません__getattribute__()。そうしないと無限に再帰的に実行されます。追加する必要がありますsuper

__setattr__()

プロパティを追加または変更すると、彼の実行がトリガーされます

class A:
    def __init__(self):
        self.exist = True
        self.counter = 0

    def __setattr__(self, key, value):
        print(f"key is {
      
      key} value is {
      
      value}")
        super().__setattr__(key, value)


o = A()
o.exist = False
print(o.exist)

__delattr__()

オブジェクトの通常の生成および消滅時にはこの関数は呼び出されませんが、オブジェクトのプロパティを削除しようとするときにこの関数が呼び出されます。

class A:
    def __init__(self):
        self.exist = True
        self.counter = 0

    def __delattr__(self, item):
        print(f"del {
      
      item}")
        super().__delattr__(item)

o = A()
del o.exist

__dir__()

dirこのメソッドは、利用可能なすべての属性またはメソッドを返すために使用されます。Python では、このメソッドが 1 つを返さなければならないと規定されていますsequence。最も一般的なのはsequenceリストです。ここではリストを返します。

class A:
    def __init__(self):
        self.exist = True
        self.counter = 0

    def __dir__(self):
        lst = super().__dir__()
        return [el for el in lst if not el.startswith("_")]

o = A()
print(dir(o))

__slots__

これはメソッドではなく、このクラスにどのカスタマイズが存在できるかを指定する属性でありattribute、ホワイトリスト メカニズムです。

__init_subclass__()

このメソッドは基本クラスで定義する必要があります。このクラスを基本クラスとして使用して派生クラスを作成すると、このメソッドが呼び出されます。

class Base:
    def __init_subclass__(cls, **kwargs):
        print(cls)

class A(Base):
    pass

o = A()

__set_name__()

class D:
    def __set_name__(self, owner, name):
        print(owner,name)

class A:
    x = D()

o = A()

このクラスのインスタンスを別のクラスで構築すると、このメソッドが呼び出されます。実際には、記述子をまだ定義しています。

おすすめ

転載: blog.csdn.net/weixin_43903639/article/details/129087823