1. class Student(object):
  2. def __init__(self,name,age):
  3. pass
  4. def __call__(self, *args, **kwargs):
  5. print(args)
  6. print(kwargs)
  7. stu = Student()
  8. print(stu('w',25,x=3))
  9. """"
  10. ('w', 25)
  11. {'x': 3}
  12. None # 因为没有返回值
  13. """

callnew_的联系

在类实例化的过程当中,哪个对象加 () 就寻找产生这个对象的类的call方法,只要是call方法,一定会做三件事情:
第一:调用new方法,构造新的对象,相当于 Java 当中的构造函数.(对象自己的new
第二:调用init方法, 去初始化这个对象(对象自己的init
第三:返回这个对象.

  1. class MyMetaClass(type):
  2. def __call__(cls, *args, **kwargs):
  3. print(cls)
  4. return 666
  5. class Person(object, metaclass=MyMetaClass): # 这一行: Person = MyMetaClass('Person',(object,),{...})
  6. country = 'China'
  7. def __init__(self, name, age):
  8. print('-----Person--init-----')
  9. self.name = name
  10. self.age = age
  11. def tell_info(self):
  12. print('%s 的年龄是:%s' % (self.name, self.age))
  13. person = Person('wang',25)
  14. print(person)
  15. #<class '__main__.Person'>
  16. # 666

类实例化的过程做了三件事

第一:触发元类中(造出这个类的类)的call方法
第二:通过new产生一个空对象
第三:通过init初始化这个对象
第四:返回这个对象