3.1.16 自定义元类来控制类的实例化行为

#知识储备__call__方法
# class Foo:
#     def __call__(self, *args, **kwargs):
#         print(self)
#         print(args)
#         print(kwargs)
#
#
# obj=Foo()
默认定义的类,没有__call__方法时,对象是不能被调用的,即:obj()是不行的,会提示obj是不能被调用的。
当对象的类中定义了__call__方法后,对象就可以像类一样被调用。 # # obj(1,2,3,a=1,b=2,c=3) #等价于:obj.__call__(obj,1,2,3,a=1,b=2,c=3) # # # #正常类是可以调用的,所以元类内部也应有有一个__call__方法,会在调用Foo时触发执行 # #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=Chinese('egon',age=18) # print(self) #self=Chinese # print(args) #args=('egon',) # print(kwargs) #kwargs={'age': 18} #第一件事:先造一个空对象obj obj=object.__new__(self) #第二件事:初始化obj self.__init__(obj,*args,**kwargs) #第三件事:返回obj return obj class Chinese(object,metaclass=Mymeta): ''' 中文人的类 ''' country='China' def __init__(self,namem,age): self.name=namem self.age=age def talk(self): print('%s is talking' %self.name) obj=Chinese('egon',age=18) #等价于: obj=Chinese.__call__(Chinese,'egon',18)
#那么__call__应该做以下三件事:
#1. 创建空对象
#2. 初始化空对象
#3. 返回对象 print(obj.__dict__)

  

posted @ 2018-06-02 11:06  beallaliu  阅读(108)  评论(0编辑  收藏  举报