1. 程式人生 > >自定義元類控制類的實例化行為

自定義元類控制類的實例化行為

type count foo ise not in def str 觸發 metaclass

# 知識儲備 __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__)

自定義元類控制類的實例化行為