楔子:引子,铺垫的意思,就是为什么要有继承呢
假如我要定义一个猫类,一个狗类
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
广度继承
深度优先