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

 更新时间:2023年05月31日 09:46:34   作者:ponponon  
这篇文章主要为大家介绍了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+matplotlib实现计算两个信号的交叉谱密度实例

    Python+matplotlib实现计算两个信号的交叉谱密度实例

    这篇文章主要介绍了Python+matplotlib实现计算两个信号的交叉谱密度实例,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • python2与python3共存问题的解决方法

    python2与python3共存问题的解决方法

    这篇文章主要为大家详细介绍了python2与python3共存问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • 分布式全文检索引擎ElasticSearch原理及使用实例

    分布式全文检索引擎ElasticSearch原理及使用实例

    这篇文章主要介绍了分布式全文检索引擎ElasticSearch原理及使用实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Python使用cx_Oracle库连接Oracle数据库指南

    Python使用cx_Oracle库连接Oracle数据库指南

    这篇文章主要为大家介绍了Python使用cx_Oracle库连接Oracle数据库指南,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Python列表的深复制和浅复制示例详解

    Python列表的深复制和浅复制示例详解

    这篇文章主要给大家介绍了关于Python列表的深复制和浅复制的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Jupyter Notebook远程登录及密码设置操作

    Jupyter Notebook远程登录及密码设置操作

    今天小编就为大家分享一篇Jupyter Notebook远程登录及密码设置操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python魔术方法专题

    Python魔术方法专题

    这篇文章主要介绍了Python魔术方法的的相关资料,文章讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Celery+django+redis异步执行任务的实现示例

    Celery+django+redis异步执行任务的实现示例

    本文主要介绍了Celery+django+redis异步执行任务的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • Python文本进度条实现过程

    Python文本进度条实现过程

    文章介绍了使用`print()`函数实现简单的非刷新文本进度条的方法,并按照任务执行百分比来更新进度条,提供了单行动态刷新和带刷新的文本进度条的示例,此外,还设计了不同风格的进度条更新函数,以适应不同的需求和偏好
    2026-04-04
  • Python多线程编程入门详解

    Python多线程编程入门详解

    这篇文章主要为大家介绍了Python多线程编程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12

最新评论