class Student(object):def __init__(self,name,age):passdef __call__(self, *args, **kwargs):print(args)print(kwargs)stu = Student()print(stu('w',25,x=3))""""('w', 25){'x': 3}None # 因为没有返回值"""
call 与new_的联系
在类实例化的过程当中,哪个对象加 () 就寻找产生这个对象的类的call方法,只要是call方法,一定会做三件事情:
第一:调用new方法,构造新的对象,相当于 Java 当中的构造函数.(对象自己的new)
第二:调用init方法, 去初始化这个对象(对象自己的init)
第三:返回这个对象.
class MyMetaClass(type):def __call__(cls, *args, **kwargs):print(cls)return 666class Person(object, metaclass=MyMetaClass): # 这一行: Person = MyMetaClass('Person',(object,),{...})country = 'China'def __init__(self, name, age):print('-----Person--init-----')self.name = nameself.age = agedef tell_info(self):print('%s 的年龄是:%s' % (self.name, self.age))person = Person('wang',25)print(person)#<class '__main__.Person'># 666
类实例化的过程做了三件事
第一:触发元类中(造出这个类的类)的call方法
第二:通过new产生一个空对象
第三:通过init初始化这个对象
第四:返回这个对象
