答案:先有 “类属性”,再有 “运行 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) # 输入: 30obj.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'>JOHN30