继承的楔子和派生

楔子:引子,铺垫的意思,就是为什么要有继承呢
假如我要定义一个猫类,一个狗类

class Cat:
    '''
    定义一个猫类
    '''
    def __init__(self, name, kind, food, language):
        self.name = name
        self.kind = kind
        self.food = food
        self.language = language

    def yell(self):
        print('%s' % self.language)

    def eat(self):
        print('Eat %s' % self.food)

    def drink(self):
        print('Drink Water')

    def catch_mice(self):
        print('Catch mice')

class Dog:
    '''
    定义一个狗类
    '''
    def __init__(self, name, kind, food, language):
        self.name = name
        self.kind = kind
        self.food = food
        self.language = language

    def yell(self):
        print('%s' % self.language)

    def eat(self):
        print('Eat %s' % self.food)

    def drink(self):
        print('Drink Water')

    def look_after_house(self):
        print('A dog can look after house')

有没有发现这两个类的方法大部分都是相同的,只有很小的差别。如果可以把他们相同的属性或方法放在一个类中,然后两者都可以用该类中所有的方法,
可以节省很多代码,所以就有了继承的。

可以把他们相同的方法放在一个叫动物的类中


class Animal:
    '''
    定义一个动物类
    '''
    def __init__(self, name, kind, food, language):
        self.name = name
        self.kind = kind
        self.food = food
        self.language = language

    def yell(self):
        print('%s' % self.language)

    def eat(self):
        print('Eat %s' % self.food)

    def drink(self):
        print('Drink Water')


class Cat(Animal):
    '''
    继承Animal类的所有方法和属性
    '''
    def catch_mice(self):  # 定义该类独有的方法
        print('Catch mice')

class Dog(Animal):
    '''
    继承父类Animal
    '''
    def look_after_house(self):   # 该类独特方法
        print('A dog can look after house')

父类也叫超类,基类,子类也叫派生类
继承与重用:父类中所有属性和方法都可以被子类使用
如:

miaos = Cat('Miaos', 'persian', 'cat food', 'miaow')
print(miaos.name)  # Miaos
miaos.drink()   # Drink Water

luc = Dog('Lucy', 'breed', 'dog food', 'wangwang')
print(Luc.name)  # Lucy
Luc.yell()  # wangwang

派生



class Animal:
    def __init__(self,name,kind,food,language):
        print('in animal')
        self.name = name
        self.kind = kind
        self.food = food
        self.language = language
    def yell(self):
        print('%s叫'%self.language)
    def eat(self):
        print('吃%s'%(self.food))
    def drink(self):
        print('喝水')

class Cat(Animal):  # Animal的派生类
    def __init__(self, name, kind, food, language, eye_color):
        self.eye_color = eye_color  # 派生的属性,也就是不仅继承了父类方法中的__init__方法,而且在该方法的基础上多加了自己类中独有的属性
        Animal.__init__(self.name, kind, food, language)  # 格式:父类名.方法名(父类中的参数)
        # super().__init__(name, kind, food, language)  # 或者用super()的方法,区别是少传了一个self参数。效果是一样的

    def eat(self):  # 如果有一个方法和父类一样,但是我还想增加自己类中的执行语句,所以就在执行语句中直接引用父类的方法
        Animal.eat(self)
        # super().eat()  # super().方法名() 直接调用。
        self.weight = 10

继承的内存运行机制

class Foo:
    def __init__(self):
        self.func()
    def func(self):
        print('in Foo')

class Son(Foo):
    def func(self):
        print('in Son')

s1 = Son()  # in Son

这里写图片描述

广度继承
这里写图片描述

深度优先
这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42233629/article/details/82317953