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

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

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

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

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

class A:
    ...

print(A)  # 输出:<class '__main__.A'>
print(type(A))  # A 的类型 # 输出:<class 'type'>

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

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

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

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

Student = type('Student', (object, ), {
    
    'name': 'test'})

print(Student().name)  # 输出:test

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

class MyMetaclass(type):

    def __new__(cls, name, bases, dict):
        return type.__new__(cls, name, bases, dict)

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

class MyMetaclass:
    ...


class MyClass(metaclass=MyMetaclass):
    ...
# 上面两行等价于下面一行
MyClass = MyMetaclass('MyClass', (object, ), {
    
    })

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

一个例子:

扫描二维码关注公众号,回复: 15242378 查看本文章
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

猜你喜欢

转载自blog.csdn.net/weixin_44495599/article/details/126184914