python - 继承

简介

优点:
1、增加代码的耦合性,(宜精不宜多)
2、减少重复的代码
3、使代码更加规范、合理、简洁
分类:
1、单继承
2、多继承
语法:

class 类名(父类):
    子类属性
    子类方法

其他:
object是所有类的父类,就算类的括号里不写,默认也是继承了object。

示例:

class Animal():

    typename = '动物'

    def __hunt(self):
        print("父类的私有方法")

    def eat(self):
        print("动物需要吃东西")

    def water(self):
        print("动物需要喝水")

class Cat(Animal):

    def shout(self):
        print("小猫喵喵喵~")


class Dog(Animal):
    
    def shout(self):
        print("小狗汪汪汪~")

cat1 = Cat()
cat1.eat()
cat1.shout()
print(cat1.typename)
# cat1.__hunt()  无法使用父类的私有属性、方法

dog1 = Dog()
dog1.eat()
dog1.shout()

继承的传递性

子类A的子类可以继承子类A的父类,简言之,孙子可以继承爷爷的共有属性和方法。

示例 :

class Animal():
    
    typename = '动物'

    def __hunt(self):
        print("父类的私有方法")

    def eat(self):
        print("动物需要吃东西")

    def water(self):
        print("动物需要喝水")

class Cat(Animal):

    sex = 'man'

    def shout(self):
        print("小猫喵喵喵~")

class CatBoBo(Cat):

    def bobo_cat(self):
        print("我是一直小猫咪,我叫bobo")

bobo = CatBoBo()
bobo.bobo_cat()
bobo.eat() # 父类的父类的方法
print("typename:",bobo.typename)  # 父类的父类的属性
bobo.shout() # 父类的方法 
print("sex:",bobo.sex)  # 父类的属性

重写父类的方法

覆盖父类的方法,重写父类的方法,子类的方法名和父类的方法名一致。
方式1:覆盖父类的方法
如果在开发过程中,父类方法的实现和子类方法的实现完全不同,就可以使用覆盖的方法在子类中重新编写父类的方法,在运行中,只会调用在子类中重写的父类方法,而不会调用父类的方法
语法:方法名和父类的方法名一样,方法实现根据子类的需求而定。
方式2:扩展父类的方法
如果在开发过程中,子类的方法的实现包含父类方法的实现,在需要使用的位置使用父类名.方法(self)来调用父类方法的执行,代码其他位置针对子类的需求,编写子类特有的代码实现。
语法:方法名和父类的方法名一样,方法实现:父类名.方法名()子类的扩展方法

示例:

class Animal():
    
    typename = '动物'

    def __hunt(self):
        print("父类的私有方法")

    def eat(self):
        print("动物需要吃东西")

    def water(self):
        print("动物需要喝水")

class Cat(Animal):

    sex = 'man'
    # 覆盖父类的方法
    def eat(self):
        print("小猫爱吃鱼~~")

    #  重写父类的方法
    def water(self):
        Animal.water()
        print("小猫爱喝马桶水~~")

多继承语法

class 类名(父类1,父类2):
    子类属性
    def 子类特有的方法
    .....

其他:如果父类1和父类2有重名的方法,子类在调用的时候会去调用继承的第一个父类的方法,
如果父类1,父类2,子类有相同的方法名,子类就优先使用自己的方法。

示例:

class Animal():
    
    typename = '动物'

    def hunt(self):
        print("动物需要捕猎")

    def eat(self):
        print("动物需要吃东西")

    def water(self):
        print("动物需要喝水")

class Cat():

    def eat(self):
        print("小猫爱吃鱼~~")

    def water(self):
        print("小猫咪爱喝主人杯子里的水~")

class HelloKitty(Animal, Cat):

    def water(self):
        print("父类也有water方法,但是我自己也有water,所以调用了我自己的")

    def play(self):
        print("hello kitty 自己特有的方法play")

hellokitty = HelloKitty()
hellokitty.eat()  #两个父类都有eat方法,会去调用继承的第一个父类的eat方法

父类构造方法的继承与重写

情况1:父类有构造方法,子类没有,子类实例化对象时会自动调用父类的构造方法
情况2:父类有构造方法,子类也有构造方法,子类实例化对象时会调用自己的构造方法
情况3:父类有构造方法,子类也有构造方法,子类的构造方法对父类的构造方法进行扩展。
子类调用父类构造方法的语法:

super(子类,self).__init__(参数1,参数2.....)
父类名称.__init__(self,参数1,参数2.....)

示例

class Animal():
    
    def __init__(self, name, sex, typename):
        self.name = name
        self.sex = sex
        self.typename = typename

    def hunt(self):
        print("动物需要捕猎")

    def eat(self):
        print("动物需要吃东西")

    def water(self):
        print("动物需要喝水")

class Cat(Animal):

    def cat(self):
        print("我是小猫咪,我叫bobo")

bobo = Cat("bobo", "girl", "cat")
print("""我叫{},我的性别是{},我是一只{}""".format(bobo.name,bobo.sex,bobo.typename))
bobo.cat()


class Dog(Animal):
    
    def __init__(self, name, sex, typename, type):
        self.name = name
        self.sex = sex
        self.typename = typename
        self.type = type

    def shot(self):
        print("小狗汪汪汪~~")

dog = Dog("旺财","公","狗","中华田园犬")
print("""我叫{},我的性别是{},我是一只{},品种是:{}""".format(dog.name,dog.sex,dog.typename,dog.type))
dog.shot()

class Pig(Animal):
    
    def __init__(self, weight,name,sex,typename):
        self.weight = weight
        Animal.__init__(self,name,sex,typename)

    def shot(self):
        print("小猪哼哼哼~~")

pig = Pig(300,"居居","公","小猪")
print("""我的体重是{}斤,我叫{},我的性别是{},我是一只{}""".format(pig.weight,pig.name,pig.sex,pig.typename))
pig.shot()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值