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
以上就是python是先运行metaclass还是先有类属性解析的详细内容,更多关于python metaclass类属性的资料请关注脚本之家其它相关文章!
相关文章
利用Python实现K-Means聚类的方法实例(案例:用户分类)
k-means是发现给定数据集的k个簇的算法,也就是将数据集聚合为k类的算法,下面这篇文章主要给大家介绍了关于利用Python实现K-Means聚类的相关资料,需要的朋友可以参考下2022-05-05
最新评论