我们进一步的升级自己的代码。
# 猫和狗吃的东西我们完全可以通过传入参数来实现。 # 子类想要调用父类方法的同时还想执行自己的方法 # 猫和狗在调用eat方法的时候调用自己的eat方法,也调用父类的Animal的eat方法 # 在子类中调用父类的方法:父类名.方法名(self) 这里要主动传入self参数 class Animal: def __init__(self, name,food): self.name = name self.food = food self.blood = 100 self.wise = 100 def eat(self): print(f\'{self.name} is eating {self.food}!\') def drink(self): print(f\'{self.name} is drinking\') def sleep(self): print(f\'{self.name} is sleeping!\') class Cat(Animal): def eat(self): self.blood += 100 Animal.eat(self) # 这是一个实现子类想要调用父类方法的同时还想执行自己的方法的关键代码 def climb_tree(self): print(f\'{self.name} is climbing tree\') # Animal.drink(self) 这两个方法都可以 一样 # self.drink() class Dog(Animal): def eat(self): self.wise += 100 Animal.eat(self) def climb_tree(self): print(f\'{self.name} is house keeping\') cat = Cat(\'布偶\',\'猫粮\') dog = Dog(\'萨摩耶\',\'狗粮\') cat.eat() dog.eat() cat.climb_tree() \'\'\' 布偶 is eating 猫粮! 萨摩耶 is eating 狗粮! 布偶 is climbing tree \'\'\' print(cat.__dict__) print(dog.__dict__) \'\'\' 输出的结果为: 布偶 is eating 猫粮! 萨摩耶 is eating 狗粮! 布偶 is climbing tree {\'name\': \'布偶\', \'food\': \'猫粮\', \'blood\': 200, \'wise\': 100} {\'name\': \'萨摩耶\', \'food\': \'狗粮\', \'blood\': 100, \'wise\': 200} \'\'\'我们用继承的知识来做下面的一个题目:
class Foo: def __init__(self): self.func() def func(self): print(\'in foo\') class Son(Foo): def func(self): print(\'in son\') Son() # 输出的结果为:in son我们再用继承的知识再来做下面一个题目:
class Animal: def __init__(self,name,food): self.name = name self.food = food self.blood = 100 self.wise = 100 def eat(self): print(f\'{self.name} is eating {self.food}!\') def drink(self): print(f\'{self.name} is drinking\') def sleep(self): print(f\'{self.name} is sleeping!\') class Cat(Animal): def __init__(self, name, food, eye_color): Animal.__init__(self, name, food) # 调用了父类的初始化,去完成一些通用属性的初始化 self.eye_color = eye_color # 派生属性,在自己的初始化函数来书写 cat = Cat(\'小白\',\'猫粮\',\'蓝色\') print(cat.__dict__) # {\'name\': \'小白\', \'food\': \'猫粮\', \'blood\': 100, \'wise\': 100, \'eye_color\': \'蓝色\'}在这里我们总结一下继承的所有知识:
1.继承语法:class 子类名(父类名):pass class 子类名(父类名1,父类名2...):pass
2.子类可以使用父类中的:方法和静态变量(静态属性)
3.当子类和父类的方法重名的时候,我们只使用子类的方法,而不是去调用父类的方法了。(在java语言中这个叫做方法的重写)
4.子类可以使用父类中的方法,但是也可以重写父类中的方法,同时也可以使用静态变量。
5.父类和子类的方法的选择
子类永远优先调用自己的方法,自己没有就用父类的方法。如果自己有,还想用父类的,直接在子类方法中调用父类的方法。调用的方法:父类名.方法名(self)、父类名.方法名(对象)
6.父类和子类的属性的选择
子类永远优先调用自己的属性,自己没有就用父类的属性。如果自己有,还想用父类的,直接在子类中调用父类的属性。调用的方法:父类名.属性
7.其实子类和父类的属性和方法等等之间的关系实质上是面向对象的命名空间等之间的关系,只要掌握了面向对象命名空间之间的关系,子类与父类的属性和方法等等关系我们也可以弄的很清楚。
2)单继承和多继承我们现在来学习一下单继承和多继承的知识。
单继承:只要继承了一个父类就叫做单继承(一个父类)
class D: pass class C(D): pass class B(C): pass class A(B): pass多继承:继承了两个或者两个以上的父类就叫做多继承(多个父类)
有一些语言是不支持多继承的,例如java语言。python和C++语言的特点是都可以在面向对象中支持多继承。
class A: def func(self): print(\'in A\') class B: def func(self): print(\'in B\') # 只是关系谁写在前面谁写在后面 class C(A,B):pass c = C() c.func() # in A总结:
单继承---调子类的:子类自己有的时候。调父类的:子类自己没有的时候。调子类和父类的:子类和父类都有,在子类中调用父类的。
多继承---一个类有多个父类,在调用父类的时候,按照继承的顺序,先继承的先寻找。
3)类的继承顺序(单继承和多继承)我们讲解类的继承的顺序的时候,我们先讲解一下新式类和经典类。