自定义元类控制类的实例化行为
Posted jt925
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义元类控制类的实例化行为相关的知识,希望对你有一定的参考价值。
# 知识储备 __call__ 方法,对象加括号就默认执行__call__()
# class Foo:
# def __call__(self, *args, **kwargs):
# print(self)
# print(args)
# print(kwargs)
#
# obj = Foo()
# obj(1,2,3,a=1,b=2,c=3)
# 元类内部也应有一个__call__方法,会在类实例化时触发
# Foo(1,2,x=1) => Foo.__call__(Foo,1,2,x=1)
class Mymeta(type):
def __init__(self,class_name,class_bases,class_dic):
if not class_name.istitle():
raise TypeError(‘类名的首字母必须大写!‘)
if ‘__doc__‘ not in class_dic or not class_dic[‘__doc__‘].strip():
raise TypeError(‘必须有注释,且注释不能为空!‘)
super(Mymeta,self).__init__(class_name,class_bases,class_dic)
def __call__(self, *args, **kwargs):
# 第一件事:先造一个空对象obj
obj = object.__new__(self)
# 第二件事:初始化obj
self.__init__(obj, *args, **kwargs)
# 第三件事:返回obj
return obj
class Chinese(object,metaclass=Mymeta):
‘‘‘
中文类
‘‘‘
country = ‘China‘
def __init__(self,name,age):
self.name = name
self.age = age
def talk(self):
print(‘%s is talking‘ % self.name)
obj = Chinese(‘egon‘,age=18)
print(obj.__dict__)
以上是关于自定义元类控制类的实例化行为的主要内容,如果未能解决你的问题,请参考以下文章