初始化
- 当在Python中出现继承的情况时,一定要注意初始化函数init的行为:
- 如果子类没有定义自己的初始化函数,父类的初始化函数会被默认调用;但是如果要实例化子类的对象,则只能传入父类的初始化函数对应的参数,否则会出错。
- 如果子类定义了自己的初始化函数,而在子类中没有显示调用父类的初始化函数,则父类的属性不会被初始化
- 如果子类定义了自己的初始化函数,在子类中显示调用父类,子类和父类的属性都会被初始化
子类没有定义自己的初始化函数,父类的初始化函数会被默认调用:
# 定义父类:Parent
class Parent(object):
def __init__(self, name):
self.name = name
print("create an instance of:", self.__class__.__name__)
print("name attribute is:", self.name)
# 定义子类Child ,继承父类Parent
class Child(Parent):
pass
# 子类实例化时,由于子类没有初始化,此时父类的初始化函数就会默认被调用
# 且必须传入父类的参数 name
c = Child("init Child")
- 子类实例化时,由于子类没有初始化,此时父类的初始化函数就会默认被调用,此时传入父类的参数name,输出结果为(没有传入父类name参数的输出结果会报错:):
create an instance of: Child
name attribute is: init Child
## (没有传入父类name参数的输出结果会报错)
Traceback (most recent call last):
File "xxx.py", line 40, in <module>
c = Child()
TypeError: __init__() missing 1 required positional argument: 'name'
子类定义了自己的初始化函数,而在子类中没有显示调用父类的初始化函数,则父类的属性不会被初始化
class Parent(object):
def __init__(self, name):
self.name = name
print("create an instance of:", self.__class__.__name__)
print("name attribute is:", self.name)
# 子类继承父类
class Child(Parent):
# 子类中没有显示调用父类的初始化函数
def __init__(self):
print("call __init__ from Child class")
# c = Child("init Child")
# print()
# 将子类实例化
c = Child()
print(c.name)
在子类中没有显示调用父类的初始化函数,则父类的属性不会被初始化,因而此时调用子类中name 属性不存在:
Traceback (most recent call last):
File "xxx.py", line 57, in <module>
print(c.name)
AttributeError: 'Child' object has no attribute 'name'
如果子类定义了自己的初始化函数,显示调用父类,子类和父类的属性都会被初始化
class Parent(object):
def __init__(self, name):
self.name = name
print("create an instance of:", self.__class__.__name__)
print("name attribute is:", self.name)
class Child(Parent):
def __init__(self):
print("call __init__ from Child class")
super(Child,self).__init__("data from Child") # 要将子类 Child 和 self 传递进去
# c = Child("init Child")
# print()
d = Parent('tom')
c = Child()
print(c.name)
子类定义了自己的初始化函数,显示调用父类,子类和父类的属性都会被初始化的输出结果:
# 实例化父类Parent的结果
create an instance of: Parent
name attribute is: tom
# 实例化子类Child的结果
call __init__ from Child class
# super 首先会先使得父类初始化的参数进行实例化
create an instance of: Child
name attribute is: data from Child
data from Child