Python -- 继承关系

什么是继承?

  • 专业角度:B类继承A类,B类就叫做A的子类/派生类,A就叫做B类的父类/超类
  • B类以及B类的对象可以使用A 类的所有的属性以及方法

继承的优点:

  • 节省代码
  • 增强耦合性
  • 使代码更加规范化

通过一个例子看一下继承:

class Person:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
        
class Cat:
    def __init__(self,name,sex,age):
        self.name = name
        self.age = age
        self.sex = sex

class Dog:
    def __init__(self,name,sex,age):
        self.name = name
        self.age = age
        self.sex = sex
        
# 继承的用法
class Animal:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
        
class Person(Animal):
    psss

class Dog(Animal):
    pass

class Cat(Animal):
    pass

单继承

  • 从类名执行父类的属性

  • 从对象执行父类的属一切(实例化对象一定会发生三件事,一定会执行__init__)

    注意:子类以及子类对象只能调用父类的属性以及方法,不能操作(增删改)

class Animal:

    live = '有生命'

    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    def eat(self):
        print(self)     # 哪个对象执行方法就将这个对象的地址传给方法中的self
        print('都要吃饭')

class Dog(Animal):
    pass

d = Dog('黑豆',6,'ladboy')
print(d.__dict__)
print(d.live)
d.eat()

#如何既要执行父类方法又要执子类方法

class Animal:

    live = '有生命'

    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    def eat(self):
        # print(self)
        print('都要吃饭')

class Dog(Animal):

    def __init__(self,name,age,sex,hobby):
        # Animal.__init__(self,name,age,sex)      # 方法一
        # super(Dog,self).__init__(name,age,sex)  # 方法二
        super().__init__(name,age,sex)            # 方法二简写
        self.hobby = hobby

    def eat(self):
        super().eat()
        print('吃饭啦')

d = Dog('黑豆',6,'ladboy','抢球')
print(d.__dict__)
d.eat()

# 执行顺序: 实例化对象必须执行__init__方法,子类中没有,从父类中找,父类没有,从object中找
# 先要执行自己类中的eat方法,自己类没有才能执行父类的方法
# 单继承练习题


class Base:
    def __init__(self, num):
        self.num = num   # num = 123
    def func1(self):
        print(self.num)  

class Foo(Base):
    pass
obj = Foo(123)
obj.func1() # 123 运⾏的是Base中的func1  

    
class Base:
    def __init__(self, num):
        self.num = num   # num = 123
    def func1(self):
        print(self.num)
class Foo(Base):
    def func1(self):
        print("Foo. func1", self.num)
obj = Foo(123)
obj.func1() # Foo. func1 123 运⾏的是Foo中的func1       


class Base:
    def __init__(self, num):
        self.num = num
    def func1(self):
        print(self.num)
        self.func2()
    def func2(self):
        print("Base.func2")
class Foo(Base):
    def func2(self):
        print("Foo.func2")
obj = Foo(123)
obj.func1() # 123 Foo.func2 func1是Base中的 func2是⼦类中的 


class Base:
    def __init__(self, num):
        self.num = num
    def func1(self):
        print(self.num)
        self.func2()
    def func2(self):
        print(111, self.num)
class Foo(Base):
    def func2(self):
        print(222, self.num)
lst = [Base(1), Base(2), Foo(3)]
for obj in lst:
    obj.func2() # 111 1 | 111 2 | 222 3


class Base:
    def __init__(self, num):
        self.num = num
    def func1(self):
        print(self.num)
        self.func2()
    def func2(self):
        print(111, self.num)
class Foo(Base):
    def func2(self):
        print(222, self.num)
lst = [Base(1), Base(2), Foo(3)]
for obj in lst:
 obj.func1() 

多继承

class ShenXian: # 神仙
    def fei(self):
        print("神仙都会⻜")
class Monkey: # 猴
    def chitao(self):
        print("猴⼦喜欢吃桃⼦")
class SunWukong(ShenXian, Monkey): # 孙悟空是神仙, 同时也是⼀只猴
    pass
sxz = SunWukong() # 孙悟空
sxz.chitao() # 会吃桃⼦
sxz.fei() # 会⻜

Python中类的种类(继承需要):

  • 在Python2.2之前都是经典类

  • Python2.2--2.7之间存在两种类型,经典类和新式类.

    经典类:基类不继承object 查询规则:依靠深度优先的原则(从左到右,每次走到头)

    新式类:基类必须继承object 查询规则:mro算法

Python3X 只有新式类. 如果基类谁都不继承. 那这个类会默认继承 object

转载于:https://www.cnblogs.com/Agoni-7/p/11160374.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值