0. 子类是否自动调用父类的构造方法
- C++、Java 会在子类对象的构造中自动首先调用父类的构造;
- Python 则相对啰嗦一点:
- 如果子类不覆盖父类的_init_()方法,则子类默认将执行与父类一样的初始化方法;
- 但是假如子类自己重写了(也成为覆盖)父类的_init_()方法,那么就需要显式的调用父类的初始化方法了。
1. __init__ 与 __new__
class Person(object):
"""Silly Person"""
def __new__(cls, name, age):
print '__new__ called.'
return super(Person, cls).__new__(cls, name, age)
def __init__(self, name, age):
print '__init__ called.'
self.name = name
self.age = age
def __str__(self):
return '<Person: %s(%s)>' % (self.name, self.age)
if __name__ == '__main__':
piglei = Person('piglei', 24)
print piglei
- __new__的调用先于 __init__ 方法;
- __new__ 方法负责创建一个实例对象,__init__ 方法负责将该实例对象进行初始化。
- __new__方法正是创建这个类实例的方法,返回的对象正是 __init__ 的 self 参数;
- __init__ 用于实例化对象,__new__用于继承,是类别级的方法;
2. __new__ 的应用场景
-
__new__方法主要是当你继承一些不可变的class时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径
class PositiveInt(int): def __init__(self, value): return super(PositiveInt, self).__init__(self, abs(value)) class PositiveInt(int): def __new__(cls, value): return super(PositiveInt, cls).__new__(cls, abs(value))