Python 运算符重载之 __init__、__new__、__call__

献给莹莹

1. __init__ 方法

  • __init__方法负责对象的初始化,当类被创建时,__init__默认被执行了,因此__init__方法可以用来做一些初始化工作。

2. __new__ 方法

class A:
   def __init__(self):
       print("__init__ ")
       print(self)
       super(A, self).__init__()

   def __new__(cls):
       print("__new__ ")
       self = super(A, cls).__new__(cls)
       print(self)
       return self
A()
  • __new__ 方法先被调用,返回一个实例对象,这个实例对象会传递给 __init__ 方法中定义的 self 参数,以便实例对象可以被正确地初始化。

  • 如果 __new__方法不返回值(或者说返回 None)那么 __init__ 将不会得到调用,这个也说得通,因为实例对象都没创建出来,调用 init 也没什么意义。

  • __init__ 方法中除了self之外定义的参数,都将与 __new__方法中除cls参数之外的参数是必须保持一致或者等效。

  • 此外,python 还规定, __init__ 只能返回 None 值

3. __call__ 方法

  • 对象通过提供__call__ (self, [,*args [,**kwargs]]) 方法可以模拟函数的行为,如果一个对象x提供了该方法,就可以像函数一样使用它,也就是说x(arg1, arg2...) 等同于调用x.__call__(self, arg1, arg2)
  • 例如:
class DistanceForm(object):
    def __init__(self, origin):
        self.origin = origin
        print "origin :"+str(origin)

    def __call__(self, x):
        print "x :"+str(x)

p = DistanceForm(100)
p(2000)

输出为:

origin :100
x :2000

你可能感兴趣的:(Python 运算符重载之 __init__、__new__、__call__)