网络编程
位置:首页>> 网络编程>> Python编程>> python是先运行metaclass还是先有类属性解析

python是先运行metaclass还是先有类属性解析

作者:ponponon  发布时间:2022-02-10 23:24:48 

标签:python,metaclass,类属性

答案

先有 “类属性”,再有 “运行 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

来源:https://segmentfault.com/a/1190000043839540

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com