参考文章:https://www.liujiangblog.com/course/python/44
继承(python3)
- 子类在调用某个方法或变量的时候,首先在自己内部查找,如果没有找到,则开始根据继承机制在父类里查找。
- 根据父类定义中的顺序,类似以深度优先的方式逐一查找父类
多态
- 当多个子类继承父类,只要父类中有的方法,不管子类有没有重写,都可以直接调用(参数要正确)
super()函数
子类中如果有与父类同名的成员,那就会覆盖掉父类里的成员,那如果你想强制调用父类的成员呢?super()函数可以解决这个问题。
下面的例子实现加减运算,父类中有加运算,所以通过super直接使用
class Add:
def __init__(self, a, b):
self.a = a
self.b = b
print("父类的__init__方法被执行了!")
def add(self):
print("父类的add方法被执行了!")
return self.a + self.b
class Sum(Add):
def __init__(self, a, b, opt):
super(Sum, self).__init__(a=a, b=b)
self.a = a
self.b = b
self.opt = opt
def operations(self):
if self.opt == 'add':
return super(Sum, self).add()
elif self.opt == 'reduce':
print ('a: ', self.a, 'b: ', self.b)
return self.a - self.b
obj1 = Sum(1, 2, 'add')
sum1 = obj1.operations()
print('sum: ', sum1)
obj2 = Sum(1, 2, 'reduce')
sum2 = obj2.operations()
print('sum: ', sum2)
>>>
父类的__init__方法被执行了!
父类的add方法被执行了!
sum: 3
父类的__init__方法被执行了!
a: 1 b: 2
sum: -1
__init__与__new__的区别
__init__是经常用的,作用是是初始化实例的变量,__new__再__init__之前调用,作用是创建实例
class Student():
# __new__方法用于创建对象并返回对象
def __new__(cls, *args, **kwargs):
print(cls) # <class '__main__.Student'>, 代表当前类
print("__new__ ")
return object.__new__(cls) # 返回创建的实例
# 返回对象时会自动调用__init__方法进行初始化
def __init__(self, name, age):
print("__init__ ")
self.name = name
self.age = age
def __str__(self):
return "the age of student[%s] is %s" % (self.name, self.age)
if __name__ == '__main__':
t1 = Student("zs", 18)
print(t1)
"""
<class '__main__.Student'>
__new__
__init__
the age of student[zs] is 18
"""