Python中元类、__init_subclass__与类装饰器的属性归属问题
Python类属性与实例属性区分
我正试图理清Python中包含元类、__init_subclass__方法和类装饰器的类定义的精确执行顺序与交互逻辑,现在需要区分以下属性哪些属于MyDerived类本身,哪些属于MyDerived的实例:meta_attr、meta_init_attr、decorated_attr、base_subclass_attr、derived_subclass_attr、instance_attr。
给定代码如下:
class Meta(type): def __new__(mcs, name, bases, dct): print(f"Meta.__new__ called for {name}") # Perform some modification to the class dictionary dct['meta_attr'] = f"Value from {mcs.__name__}" return super().__new__(mcs, name, bases, dct) def __init__(cls, name, bases, dct): print(f"Meta.__init__ called for {name}") super().__init__(cls, name, bases, dct) cls.meta_init_attr = f"Initialized by {cls.__class__.__name__}" def class_decorator(cls): print(f"Class decorator called for {cls.__name__}") cls.decorated_attr = "Decorated!" return cls @class_decorator class MyBase(metaclass=Meta): def __init_subclass__(cls, **kwargs): print(f"MyBase.__init_subclass__ called for {cls.__name__}") super().__init_subclass__(**kwargs) cls.base_subclass_attr = "From MyBase __init_subclass__" def __init__(self): print("MyBase instance __init__ called") self.instance_attr = "Instance created" print("\nDefining MyDerived:") class MyDerived(MyBase): def __init_subclass__(cls, **kwargs): print(f"MyDerived.__init_subclass__ called for {cls.__name__}") super().__init_subclass__(**kwargs) cls.derived_subclass_attr = "From MyDerived __init_subclass__" def __init__(self): print("MyDerived instance __init__ called") super().__init__() print("\nCreating MyDerived instance:") instance = MyDerived() print("\nAttributes on MyDerived class:") print(f"MyDerived.meta_attr: {hasattr(MyDerived, 'meta_attr')}") print(f"MyDerived.meta_init_attr: {hasattr(MyDerived, 'meta_init_attr')}") print(f"MyDerived.decorated_attr: {hasattr(MyDerived, 'decorated_attr')}") print(f"MyDerived.base_subclass_attr: {hasattr(MyDerived, 'base_subclass_attr')}") print(f"MyDerived.derived_subclass_attr: {hasattr(MyDerived, 'derived_subclass_attr')}") print("\nAttributes on instance:") print(f"instance.instance_attr: {hasattr(instance, 'instance_attr')}")
属性归属说明
属于MyDerived类本身的属性
meta_attr:由元类Meta的__new__方法添加到类字典中,是类属性meta_init_attr:由元类Meta的__init__方法直接赋值给类,是类属性decorated_attr:由类装饰器class_decorator添加到MyBase类,MyDerived继承自MyBase,因此该属性属于MyDerived类(继承而来的类属性)base_subclass_attr:在MyDerived定义时,由MyBase的__init_subclass__方法赋值给MyDerived类,是类属性derived_subclass_attr:由MyDerived自身的__init_subclass__方法赋值给类,是类属性
属于MyDerived实例的属性
instance_attr:在MyBase的__init__方法中赋值给self,仅当实例创建时才会生成,是实例属性
内容的提问来源于stack exchange,提问作者user31555720
相关产品推荐
相关产品推荐

