metaclass

元类概念

元类就是创建类的类,实际上类本身也是一个对象
当定义一个类时,实际上就是用元类来创建一个类
在python中默认元类是type
所以type除了可以告诉我们一个对象的类型,还能用来创建类

通过type创建一个类

下面使用class创建一个类

class Foo(object):
    def hello(self):
        print("hello world!")
        return

如果想用type手动创建一个类

def init(self, name):
    self.name = name
    return


def hello(self):
    print("hello %s" % self.name)
    return

Foo = type("Foo", (object,), {"__init__": init, "hello": hello, "cls_var": 10})
foo = Foo("xxx")
print(foo.hello())   #“hello xxx”
print(Foo.cls_var)   #10

上面通过type创建了一个类名为"zoo",继承自object的类
字典中的键代表类方法与类属性
有初始化方法init与hello方法以及被赋值为10的cls_var类属性

自定义元类

class Author(type):
    def __new__(mcs, name, bases, dict):
        dict["name"] = "xxx"
        return super(Author, mcs).__new__(mcs, name, bases, dict)


定义了一个名为Author的自定义元类,继承自元类type,可以通过这种做法实现自定义元类

在Author元类中创建_new_方法,此方法在类的创建时最先被调用,负责创建一个新的类对象
方法中的参数解析

  • mcs:代表元类本身,也就是Author的实例,一般来说,这是python中约定俗成的自定义元类中的参数命名
  • name:后续要创建的新类的名称
  • bases:包含了创建类要继承的父类元组
  • dict:一个字典,包含了创建的类中的所有属性与方法,键是方法或属性名称,值为对应的对象

通过向字典中传入name属性且赋值为xxx来给创建的类添加一个属性

super函数:用于调用父类的方法,如上面通过super函数获取到了Author父类(也就是type)中的new方法

最后通过返回值将元类通过new方法创建的新的类对象返回

用自定义的元类来定义一个新的类

class Foo(object, metaclass=Author):
    pass

foo = Foo()
print(foo.author)      #打印结果:"xxx"

定义了一个Foo类,继承自object,并且通过metaclass = Author指定这个类的元类为上面定义的Author
所以在创建这个类时会调用元类中的new方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值