关于继承和super的使用本文做以下解释,方便新手理解编程用法。
引言
在面向对象编程中,你编写表示现实世界中的事情和情景的的类,并基于这些类来创建对象。编写类时,你定义一大类对象都有通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后可根据需要赋予每个对象独特的个性。
Python编写类时,并非总要从空白开始。如果你编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类,它将自动获得另一个类的所有属性和方法;此外,子类在继承父类的属性和方法的同时,还可以定义自己的属性和方法。
super的使用
super是一个特殊函数,能够将父类和子类关联起来。
- 子类继承父类,但不重写构造函数
__init__
(初始化),那么子类会自动继承父类属性和方法
class Person:
def __init__(self):
self.name = 'name'
self.age = 'age'
def Hello(self):
print("成功继承父类方法")
class Gao(Person):
pass
p = Person()
g = Gao()
print('父类属性:',p.name)
print('父类属性:',p.age)
print('继承父类属性:',g.name)
print('继承父类属性:',g.age)
g.Hello()
输出结果:
父类属性: name
父类属性: age
继承父类属性: name
继承父类属性: age
成功继承父类方法
- 子类继承父类,重写构造函数
__init__
(初始化),但不使用super初始化父类构造函数,那么子类不会自动继承父类的属性,会继承方法
class Person:
def __init__(self):
self.name = 'name'
self.age = 'age'
def Hello(self):
print("成功继承父类方法")
class Gao(Person):
def __init__(self):
self.height = 'height'
p = Person()
g = Gao()
g.Hello()
print('父类属性:',p.name)
print('父类属性:',p.age)
print('子类属性:',g.height)
print('继承父类属性:',g.age)
输出结果:
成功继承父类方法
父类属性: name
父类属性: age
子类属性: height
Traceback (most recent call last):
File "person.py", line 187, in <module>
print('继承父类属性:',g.age)
AttributeError: 'Gao' object has no attribute 'age'
- 子类继承父类,重写构造函数
__init__
(初始化),且使用super初始化父类构造函数,那么子类会自动继承父类的属性和方法
class Person:
def __init__(self):
self.name = 'name'
self.age = 'age'
def Hello(self):
print("成功继承父类方法")
class Gao(Person):
def __init__(self):
super().__init__()
self.height = 'height'
p = Person()
g = Gao()
g.Hello()
print('父类属性:',p.name)
print('父类属性:',p.age)
print('子类属性:',g.height)
print('继承父类属性:',g.age)
输出结果:
成功继承父类方法
父类属性: name
父类属性: age
子类属性: height
继承父类属性: age
参考《Python编程从入门到实践》