You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 07:43:23