python是先运行metaclass还是先有类属性解析
作者:ponponon
答案
先有 “类属性”,再有 “运行 metaclass”
# 定义一个元类 class CustomMetaclass(type): def __new__(cls, name, bases, attrs): print('> cls', cls) print('> name', name) print('> attrs', attrs) print('> cls dict', cls.__dict__) # 在创建类时修改属性 new_attrs = {} for attr_name, attr_value in attrs.items(): if isinstance(attr_value, str): new_attrs[attr_name] = attr_value.upper() else: new_attrs[attr_name] = attr_value obj = super().__new__(cls, name, bases, new_attrs) print(obj.__dict__) print(type(obj)) return obj # 使用元类创建类 class MyClass(metaclass=CustomMetaclass): name = 'John' age = 30 greeting = 'Hello' def say_hello(self): print(self.greeting) # 创建类的实例并调用方法 obj = MyClass() print(obj.name) # 输出: 'JOHN' print(obj.age) # 输出: 30 obj.say_hello() # 输出: 'Hello'
输出结果
> cls <class '__main__.CustomMetaclass'>
> name MyClass
> attrs {'__module__': '__main__', '__qualname__': 'MyClass', 'name': 'John', 'age': 30, 'greeting': 'Hello', 'say_hello': <function MyClass.say_hello at 0x1025c2200>}
> cls dict {'__module__': '__main__', '__new__': <staticmethod(<function CustomMetaclass.__new__ at 0x1025c2290>)>, '__doc__': None}
{'__module__': '__MAIN__', 'name': 'JOHN', 'age': 30, 'greeting': 'HELLO', 'say_hello': <function MyClass.say_hello at 0x1025c2200>, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__weakref__': <attribute '__weakref__' of 'MyClass' objects>, '__doc__': None}
<class '__main__.CustomMetaclass'>
JOHN
30
以上就是python是先运行metaclass还是先有类属性解析的详细内容,更多关于python metaclass类属性的资料请关注脚本之家其它相关文章!