类的继承

继承是面向对象的三大特征之一,一个子类可以同时继承多个直接父类。

继承的语法

class SubClass(SuperClass1,SuperClass2,...)

class Fruit:
    def info(self):
        print('我是一个水果,重%s克'%self.weight)

class Food:
    def taste(self):
        print('我是能被吃的食物')

#定义一个apple类继承Fruit和Food类
class Apple(Fruit,Food):
    pass

a=Apple()
a.weight=5.6
a.info()
a.taste()

运行结果

我是一个水果,重5.6克
我是能被吃的食物

 

上面程序定义了两个父类,Fruit和Food,Apple可以访问父类的方法

多继承中如果父类的方法有相同的,则最前面的那个类的方法有效(继承父类括号中的顺序,不是定义类的顺序,上面程序红色的地方)。python会从父类中搜寻方法,一旦找到就不会继续找下去。

重写父类的方法

class Bird:
    def fly(self):
        print('我在天上自由飞翔')

class Tuoniao:
    def fly(self):
        print('我在地上自由行走')

Bird.fly(self) #但是可以继续调用父类的重写方法
tuo=Tuoniao() tuo.fly()

结果:
我在地上自由行走
我在天上自由飞翔


使用super函数调用父类的构造方法

class Employee:
    def __init__(self,salary):
        self.salary=salary
    def work(self):
        print('员工的工资是%s'%self.salary)

class Customer:
    def __init__(self,favorite,address):
        self.favorite=favorite
        self.address=address
    def info(self):
        print('我是一个顾客,我的爱好是:%s,地址是%s'%(self.favorite,self.address))

class Manager(Employee,Customer):
    pass
m=Manager(2500)
m.work()
m.info()#报错

结果

员工的工资是2500
Traceback (most recent call last):
File "F:/study/类/类的继承3.py", line 18, in <module>
m.info()#报错
File "F:/study/类/类的继承3.py", line 12, in info
print('我是一个顾客,我的爱好是:%s,地址是%s'%(self.favorite,self.address))
AttributeError: 'Manager' object has no attribute 'favorite'

 

Manager 会优先使用Employee类的构造方法,因为它排在前面,只会有salary。

class Employee:
    def __init__(self,salary):
        self.salary=salary
    def work(self):
        print('员工的工资是%s'%self.salary)

class Customer:
    def __init__(self,favorite,address):
        self.favorite=favorite
        self.address=address
    def info(self):
        print('我是一个顾客,我的爱好是:%s,地址是%s'%(self.favorite,self.address))

class Manager(Employee,Customer):
    def __init__(self,salary,favorite,address):
        super().__init__(salary)
        #super(Manager,self).__init__(salary)# 效果和上面一样
        Customer.__init__(self,favorite,address)
m=Manager(2500,'洗澡','上海')
m.work()
m.info()


结果
员工的工资是2500
我是一个顾客,我的爱好是:洗澡,地址是上海
原文地址:https://www.cnblogs.com/inuyashalove/p/12834521.html