Pythonの高度なsyntax_magic属性と構築メソッド

魔法の属性と工法

人や物に関係なく、ルーチンに従わない状況がよくあります。クラスの場合、Pythonのクラス属性も同じです。特別な意味を持つ属性がいくつかあります。Pythonは多くの利用可能な魔法の属性を定義します。そのうちのいくつかはデフォルトです。各クラスが存在します。一部はユーザーが手動で定義する必要があります。

魔法の属性

__doc__

  • クラスの説明情報を表します
class Foo:
    """ 描述类信息,可以看到dir下的方法和属性详细说明。内容和 help()基本相同,但格式不如help()好看 """
    def func(self):
        pass

print(Foo.__doc__)
#输出:类的描述信息

__dict__

  • __dict__属性は、クラスで最も一般的に使用される属性の1つと言えます。これは、クラスの__dict__属性とインスタンスの__dict__属性に分けられます。
class Province(object):
    country = 'China'

    def __init__(self, name, count):
        self.name = name
        self.count = count

    def func(self, *args, **kwargs):
        print('func')

# 获取类的属性,即:类属性、方法、
print(Province.__dict__)
# 输出:{'__dict__': <attribute '__dict__' of 'Province' objects>, '__module__': '__main__', 'country': 'China', '__doc__': None, '__weakref__': <attribute '__weakref__' of 'Province' objects>, 'func': <function Province.func at 0x101897950>, '__init__': <function Province.__init__ at 0x1018978c8>}

obj1 = Province('山东', 10000)
print(obj1.__dict__)
# 获取 对象obj1 的属性
# 输出:{'count': 10000, 'name': '山东'}

obj2 = Province('山西', 20000)
print(obj2.__dict__)
# 获取 对象obj1 的属性
# 输出:{'count': 20000, 'name': '山西'}
  • クラスの__dict__属性は、クラスによって定義されたすべてのクラス属性とクラスメソッドで構成されるキーと値のペアを格納しますが、継承された属性とメソッドは含まれません。

  • インスタンスの__dict__属性は、インスタンス属性のすべてのキーと値のペアを格納します。そうでない場合は、空になります。__init__メソッドは、実際には__dict__属性の初期化割り当てです。

__module__和__class__

  • __module__は、現在操作されているオブジェクトがそのモジュール内にあることを意味します。定義された場所がたまたまメインプログラムである場合、値は「_main_」です。それ以外の場合は、クラスが属するモジュールの名前です。
  • __class__は、現在操作されているオブジェクトのクラスを示します

test.py

class Person(object):
    def __init__(self):
        self.name = 'Neo'

main.py

from test import Person

obj = Person()
print(obj.__module__)  # 输出 test 即:输出模块
print(obj.__class__)  # 输出 test.Person 即:输出类

__slots__

  • この属性は、属性とメソッドの動的バインディングを制限する役割を果たします。この属性はタプルであり、デフォルトでは存在しません。手動で定義する必要があり、現在のクラスでのみ機能します。タプルに追加された名前のみが可能です。属性を動的に追加します。そうしないと、エラーが報告されます。
class Person(object):
    __slots__ = ('name','age','run')
    
    def __init__(self):
        self.height = 100 # 报错

def run(self):
    print('run')

if __name__ == "__main__":
    from types import MethodType
    person = Person()
    person.name = 'cai'
    person.run = MethodType(run,person)
    person.run()

  • __slots__属性を定義すると、クラスインスタンスの属性と、動的に追加できる属性とメソッドが制限されます。

  • __slots__属性を定義した後、クラスのタプルに同じ名前のメソッドを定義してはなりません。

__getitem __、__ setitem __、__ delitem__

  • 辞書などのインデックス操作に使用されます。上記は、それぞれデータを取得、設定、削除することを意味します
class Foo(object):

    def __getitem__(self, key):
        print('__getitem__', key)

    def __setitem__(self, key, value):
        print('__setitem__', key, value)

    def __delitem__(self, key):
        print('__delitem__', key)


obj = Foo()

result = obj['k1']      # 自动触发执行 __getitem__
obj['k2'] = 'laowang'   # 自动触发执行 __setitem__
del obj['k1']           # 自动触发执行 __delitem__

工法

  • 「魔法の方法」もあります

__初期化__

  • 初期化メソッド。クラスを介してオブジェクトを作成するときに自動的に実行をトリガーします
class Person:
    def __init__(self, name):
        self.name = name
        self.age = 18


obj = Person('laowang')  # 自动执行类中的 __init__ 方法

__新着__

  • このメソッドは、クラスのインスタンスを作成するために呼び出される最初のメソッドであり、インスタンスを返します。これは、インスタンスに対して最初から呼び出す必要があるメソッドです。これは、シングルトンモードで一般的に使用され、他のモードでは一般的に使用されません。
class Person(object):
    def __new__(cls, *args, **kwargs):
        print(args)
        return object.__new__(cls)

if __name__ == "__main__":
    person = Person('name')

  • インスタンスを作成するとき、パラメーターは新しいメソッドに渡されますが、パラメーターは新しいメソッドで変更できません。

__の__

  • オブジェクトがメモリに解放されると、実行が自動的にトリガーされます。

注:Pythonは高級言語であるため、このメソッドを定義する必要はありません。この作業はPythonインタープリターによって実行されるため、プログラマーはメモリの割り当てと解放を気にする必要がありません。 __del__の呼び出しはisです。インタプリタはガベージコレクション中に自動的に実行をトリガーします。

class Foo:
    def __del__(self):
        pass

__repr__

  • このメソッドは、print()またはrepr()が呼び出されたときに実行され、クラスの情報の説明を定義するために使用されます。各クラスは、このメソッドを定義する必要があります。

総括する

  • クラスの一般的な魔法の属性は__doc __、__ dict __、__ module __、__ class __、__ slots__であり、これらの中でスロット属性をカスタマイズする必要があり、他の属性はデフォルトで存在します。

  • __init__,__new__,__del__作成、初期化、トリガーされた破棄されたクラスで一般的に使用されるクラス構造

おすすめ

転載: blog.csdn.net/weixin_42250835/article/details/89978799