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

posted on 2019-07-09 20:52  ShenQiang  阅读(720)  评论(0编辑  收藏  举报