• 2.1.7 面向对象:类实例化(元类)(Python)


    本文来自异想之旅公开发布的Python教程,原文地址:https://www.yuque.com/yxzl/python

    这节的确是太难了点……新手快跑!!

    上一篇我们将到,Python 中一切皆对象。所以类本身(不是实例化出来的对象)本身也是一个对象。类的类型是 Type

    type(对象) 可以查看对象的类型。

    class A:
        ...
    
    print(A)  # 输出:
    print(type(A))  # A 的类型 # 输出:
    
    • 1
    • 2
    • 3
    • 4
    • 5

    既然类是type类型的,我们也可以通过实例化type来动态建立一个类。

    先看看type定义类时初始化函数的重载:

    def __init__(self, __name: str, __bases: tuple[type, ...],
                 __dict: dict[str, Any], **kwds: Any) -> None:
        ...
    
    • 1
    • 2
    • 3

    type(名字, 继承关系(被继承的父类), 一个包含着属性和方法的字典)可以建立一个类。

    Student = type('Student', (object, ), {'name': 'test'})
    
    print(Student().name)  # 输出:test
    
    • 1
    • 2
    • 3

    既然我们可以通过实例化type来建立类,我们也可以通过继承type来获得一个可以用来建立类的类。这种类称为元类。

    class MyMetaclass(type):
    
        def __new__(cls, name, bases, dict):
            return type.__new__(cls, name, bases, dict)
    
    • 1
    • 2
    • 3
    • 4

    我们可以通过该元类来建立类。

    class MyMetaclass:
        ...
    
    
    class MyClass(metaclass=MyMetaclass):
        ...
    # 上面两行等价于下面一行
    MyClass = MyMetaclass('MyClass', (object, ), {})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    所以说,建立一个类class MyClass: ...相当于class MyClass(object, metaclass=type): ...

    一个例子:

    class MyMetaclass(type):
    
        def __new__(cls, name, bases, dict):
            dict['test'] = lambda self, x: x + 1
            # lambda 匿名函数,具体请见《函数(二)》章节
            # 相当于下面的写法
            def foo(self, bar):
                return bar - 1
            dict['test2'] = foo
            return type.__new__(cls, name, bases, dict)
    
    
    class MyClass(metaclass=MyMetaclass):
        ...
    
    
    print(MyClass().test(1))  # 输出:2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
  • 相关阅读:
    Edge在IE模式下加载网页 - Edge设置IE兼容性
    NC20583 [SDOI2016]齿轮
    力扣第695题 岛屿的最大面积 C++ DFS BFS 附Java代码
    Makefile入门(二)
    kibana 7安装
    C++ 11 & 14 中的Lambda表达式 补充
    盛元广通开放实训室管理系统2.0
    大型语言模型中的幻觉研究综述:原理、分类、挑战和未决问题11.15+11.16+11.17
    认识广告数据分析
    聚焦数字化项目管理——2023年PMI项目管理大会亮点回顾
  • 原文地址:https://blog.csdn.net/weixin_44495599/article/details/126184914