答案:先有 “类属性”,再有 “运行 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。