type()
python中函数和类的定义,不是编译时定义的,而是运行时动态创建的。
比如定义一个class,写法一:
class Toodo(object):
def fun(self, msg="toodo.fun"):
print(msg)
写法二:
def fun(self, msg="toodo.fun"):
print(msg)
Toodo = type("Toodo", (object,), dict(fun=fun))
其中,type函数一次传入3个参数:
- class的名称
- 继承的父类集合,支持多重继承,如果只有一个父类,使用tuple的单例写法
- class中的方法名称与函数进行绑定,传入一个字典
toodo = Toodo()
toodo.fun()
print(type(Toodo))
>>> <class 'type'>
print(type(toodo))
>>> <class '__main__.Toodo'>
打印上面两种方法创建的Toodo类都会得到这个结果,由此可见,通过写法二的type()函数创建的类和写法一通过class是完全相同的,因为python解释器遇到class关键词时,仅扫描class中定义的内容,然后通过type()函数创建出class。
metaclass
metaclass可以控制类的创建行为,先定义metaclass,就可以创建类,然后创建实例,如:
class MyMetaclass(type):
def __new__(mcs, name, bases, attrs):
attrs["fun"] = lambda self: print("toodo.fun")
return type.__new__(mcs, name, bases, attrs)
class Toodo(metaclass=MyMetaclass):
pass
在创建类时,通过指定元类(格式为metaclass=元类名),当Python解释器在创建Toodo类时,Mymetaclass元类中的__new__方法就会被调用,从而动态添加了fun这个类方法。
new()方法接收到的参数依次是:
- 当前准备创建的类的对象
- 类的名字
- 类继承的父类集合
- 类的方法集合
可以测试以下Toodo是否可以调用fun()方法:
toodo = Toodo()
toodo.fun()
>>> toodo.fun
下面是我自己运营的微信小程序“但行趣事”和公众号“微电脑”,更多的技术文章以及视频我会放到小程序和公众号当中,有志同道合的小伙伴也可以在小程序(联系客服按钮)或者公众号(直接留言)当中联系我们
![]() |
![]() |