美文网首页
python 元类学习笔记

python 元类学习笔记

作者: 逐风细雨 | 来源:发表于2021-10-14 10:06 被阅读0次

python中已一切皆对象,类实例化后就是对象。声明一个普通的类代码如下:

class Foo:
    def __init__(self, a):
        self.a = a

    def echo_attr(self):
        print(self.a)

    @staticmethod
    def static_method():
        pass

    @classmethod
    def class_method(cls):
        pass

python中创建类,是通过type方法实现的,上述声明过程用type方法同样可以,等效代码如下:

def echo_attr(self):
    print(self.a)


def build(self, a):
    self.a = a


@staticmethod
def static_method():
    pass


@classmethod
def class_method(cls):
    pass


a = type('Foo',  # 类名
         (),  # 父类元组
         # 方法字典
         {'echo_attr': echo_attr, "__init__": build, "static_method": static_method, "class_method": class_method}
         )

类的实例化过程 :

  1. 调用 new 方法创建实例对象
  2. 创建的对象,调用 init 方法初始化
  3. 调用 call 返回初始化对象 这就是为什么 实例化是 可以加()的原因,比如:obj = Foo("111")

元类的简单理解就是,创建类的类,因此可以根据需要修改类的实例化过程,来实现某些业务功能。

  1. 元类的声明 继承type类的类就是元类,下面的例子只是加了打印
class MyMetaClass(type):

    def __new__(cls, cls_name, clas_base, cls_dict):
        print("元类 创建类时方法调用__new__方法")
        return super(MyMetaClass, cls).__new__(cls, cls_name, clas_base, cls_dict)

    def __call__(cls, *args, **kwargs):
        obj = super(MyMetaClass, cls).__call__(*args, **kwargs)
        print("实例化调用")
        return obj
  1. 元类的使用:一种是继承,另一种是 通过metaclass 属性(call定义的动作不会调用)
class MyClass(metaclass=MyMetaClass):
    def __init__(self, a, b=2):
        print("123")
        self.a = a
        self.b = b

    def echo_var(self):
        print(f"echo_var -> {self.a}, {self.b}")

class MyMeta:
    __metaclass__ = MyMetaClass

    def __init__(self, a, b=2):
        print("123")
        self.a = a
        self.b = b

    def echo_var(self):
        print(f"echo_var -> {self.a}, {self.b}")

相关文章

网友评论

      本文标题:python 元类学习笔记

      本文链接:https://www.haomeiwen.com/subject/hivufltx.html