python是先运行metaclass还是先有类属性解析
作者:ponponon 时间:2022-02-10 23:24:48
答案
先有 “类属性”,再有 “运行 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
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
python反转单链表算法题
![](https://img.aspxhome.com/file/2023/3/95153_0s.jpg)
python如何将图片生成视频MP4
![](https://img.aspxhome.com/file/2023/3/104843_0s.jpg)
python基本语法练习实例
Python学习之异常中的finally使用详解
用python实现将数组元素按从小到大的顺序排列方法
python列表推导式入门学习解析
Python Requests安装与简单运用
Python Tkinter简单布局实例教程
![](https://img.aspxhome.com/file/2023/2/97532_0s.png)
Ubuntu20下的Django安装的方法步骤
![](https://img.aspxhome.com/file/2023/5/81705_0s.png)
基于OpenCV目标跟踪实现人员计数器
![](https://img.aspxhome.com/file/2023/5/103715_0s.png)
jupyter notebook实现显示行号
![](https://img.aspxhome.com/file/2023/6/103616_0s.jpg)
如何使用postman(新手入门)
![](https://img.aspxhome.com/file/2023/6/58166_0s.jpg)
Python递归函数特点及原理解析
![](https://img.aspxhome.com/file/2023/8/100898_0s.png)
Python基于回溯法子集树模板实现图的遍历功能示例
![](https://img.aspxhome.com/file/2023/9/102829_0s.jpg)
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
对pandas replace函数的使用方法小结
![](https://img.aspxhome.com/file/2023/9/83809_0s.jpg)
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
![](https://img.aspxhome.com/file/2023/6/99446_0s.png)