小甲鱼零基础学习python_23 【python中类的继承】

1. 继承:一个子类可以继承他的父类的任何属性和方法

class  DerivedClassName(BaseClassName):
      ....
 #BaseClassName :父类,基类,超类
 #DerivedClassName: 子类

1.1 子类可以继承父类的方法,调用父类的方法:

class Parent:
    def hello(self):
        print('正在调用父类的方法...')

class Child(Parent):
    pass

P =Parent()   #定义一个父类的对象
P.hello()

C = Child()   #定义一个子类的对象
C.hello()

这里写图片描述

1.2 如果子类的属性跟父类方法同名,子类属性就会覆盖父类方法:

class C:
    def x(self):
        print('x-man')
c=C()
c.x()

c.x=1  #创建一个实例对象c的实例属性x,此时同名属性会覆盖方法
print(c.x)

这里写图片描述
如果此时还想调用父类的方法,则会报错:

c.x()

这里写图片描述

1.3 如果子类有跟父类同名的属性和方法,子类就会覆盖父类的定义:

class Child(Parent):
    def hello(self):
        print('正在调用子类的方法')


P =Parent()
P.hello()

C = Child()   #子类可以继承父类的方法,调用父类的方法
C.hello()

这里写图片描述



class Fish:    #父类 fish
    def __init__(self):
        self.x = random.randint(0, 10)  # x轴坐标
        self.y = random.randint(0, 10)  # y轴坐标

    def move(self):
        self.x-=1
        print('my location is :', self.x, self.y)

class GoldFish(Fish):   #子类 goldfish
    pass  #不做处理


class Shark(Fish):    #子类shark
    def __init__(self):    #子类重写了父类的方法,覆盖了父类的定义
        self.hungry=True

    def eat(self):
        if self.hungry:
            print('吃货的梦想就是吃不胖!')
            self.hungry = False
        else:
            print('吃不下了!')

三个类分别定义实例对象的调用:

fish = Fish()
fish.move()
fish.move()



goldfish= GoldFish()
goldfish.move()
goldfish.move()


shark =Shark()
shark.eat()
shark.eat()
# shark.move()   #报错,因为子类init方法覆盖了父类,没有给出self.x,self.y定义

这里写图片描述

2. 继承:用继承来解决shark的覆盖方法问题:

两种方法: 1. 调用未绑定的父类方法 2. super函数


2.1. 调用未绑定的父类方法:

调用未绑定的父类方法 需要父类的名字,参数中这个self是子类的实例对象

class Shark(Fish):
    def __init__(self):    #子类重写了父类的方法,覆盖了父类的定义
        Fish.__init__(self)   #调用未绑定的父类方法  这个self是子类的实例对象
        self.hungry=True

    def eat(self):
        if self.hungry:
            print('吃货的梦想就是吃不胖!')
            self.hungry = False
        else:
            print('吃不下了!')


shark =Shark()
shark.eat()
shark.eat()
shark.move()

这里写图片描述

但是每次调用未绑定父类方法都需要父类对象的名字,如果父类对象更名,则会很麻烦,所以建议使用一种更方便的方法

2.2. super函数:

super函数自动为子类找到基类方法且传入self参数 更好的方案

(不需要填写self参数)
class Shark(Fish):
    def __init__(self):    #子类重写了父类的方法,覆盖了
        super().__init__()   #super函数,自动为子类找到基类方法且传入self参数
        self.hungry=True

    def eat(self):
        if self.hungry:
            print('吃货的梦想就是吃不胖!')
            self.hungry = False
        else:
            print('吃不下了!')



shark = Shark()
shark.eat()
shark.eat()
shark.move()

这里写图片描述


3. 多重继承:

class  DerivedClassName(base1,base2....):
class Base1:
    def fool1(self):
        print('im fool1')
class Base2:
    def fool2(self):
        print('im fool2')
class C(Base1,Base2):
    pass
c= C()
c.fool1()
c.fool2()

这里写图片描述

非必要时刻最好不要使用多重继承,可能会有不可预见的bug!!

猜你喜欢

转载自blog.csdn.net/Aka_Happy/article/details/82191219
今日推荐