元类概念
元类就是创建类的类,实际上类本身也是一个对象
当定义一个类时,实际上就是用元类来创建一个类
在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方法