面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。
1 2 |
class 派生类名(基类名) ... |
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码,能够大大的提高开发的效率。
实际上继承者是被继承者的特殊化,它除了拥有被继承者的特性外,还拥有自己独有得特性。例如猫有抓老鼠、爬树等其他动物没有的特性。同时在继承关系中,继承者完全可以替换被继承者,反之则不可以,例如我们可以说猫是动物,但不能说动物是猫就是这个道理,其实对于这个我们将其称之为“向上转型”。
诚然,继承定义了类如何相互关联,共享特性。对于若干个相同或者相识的类,我们可以抽象出他们共有的行为或者属相并将其定义成一个父类或者超类,然后用这些类继承该父类,他们不仅可以拥有父类的属性、方法还可以定义自己独有的属性或者方法。
同时在使用继承时需要记住三句话:
1、子类拥有父类非私有化的属性和方法。
2、子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
3、子类可以用自己的方式实现父类的方法。(下面会介绍)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
# 无继承方式 class Dog: def eat(self): print("eating...") def sleep(self): print("sleep...") def swimming(self): print("swimming...") class Cat: def eat(self): print("eating...") def sleep(self): print("sleep...") def climb_tree(self): print("climb_tree...") # 继承方式 class Animal: def eat(self): print("eating...") def sleep(self): print("sleep...") class Dog(Animal): def swimming(self): print("toshetou...") class Cat(Animal): def climb_tree(self): print("climb_tree...") alex = Dog() alex.run() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
class Person(object): def __init__(self,name,age): self.name=name self.age=age def sleep(self): print("基类sleep...") class Emp(Person): # def __init__(self,name,age,dep): # self.name = name # self.age = age # self.dep = dep def __init__(self, name, age, dep): # Person.__init__(self,name,age) super().__init__(name,age) self.dep = dep def sleep(self): if "不在公司": # print("子类sleep...") # 调用父类方法 # 方式1 :父类对象调用 父类对象.方法(self,其他参数) # Person.sleep(self) # 方式2: super关键字 super(子类对象,self).方法(参数)or super().方法(参数) super().sleep() yuan = Emp("yuan",18,"教学部") yuan.sleep() print(yuan.dep) # 测试题: class Base: def __init__(self): self.func() def func(self): print('in base') class Son(Base): def func(self): print('in son') s = Son() |
如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" 。派生类的声明,与他们的父类类似,继承的基类列表跟在类名之后,如下所示:
1 2 |
class SubClassName (ParentClass1[, ParentClass2, ...]): ... |
多继承有什么意义呢?还拿上面的例子来说,蝙蝠和鹰都可以飞,飞的功能就重复定义了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
class Animal: def eat(self): print("eating...") def sleep(self): print("sleep...") class Eagle(Animal): def fly(self): print("fly...") class Bat(Animal): def fly(self): print("fly...") |
有同学肯定想那就放到父类Animal中,可是那样的话其他不会飞的动物还怎么继承Animal呢?所以,这时候多重继承就发挥功能了:
1 2 3 4 5 6 7 8 9 |
class Fly: def fly(self): print("fly...") class Eagle(Animal,Fly): pass class Bat(Animal,Fly): pass |