一、继承的概念
在现实生活中,继承一般指的是子女继承父辈的财产,在程序中,继承描述的是事物之间的所属关系,例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物;同理,波斯猫和巴厘猫都继承自猫,而沙皮狗和斑点狗都继承足够,如下如所示:
二、继承的示例
class Cat(object): def __init__(self,name,color="白色"): self.name = name self.color = color def run(self): print("%s:在跑"%self.name) class Bosi(Cat): def setNewName(self,newName): self.name = newName def eat(self): print("%s:在吃"%self.name) bs = Bosi("波斯猫") print("bs的名字是:%s,颜色是:%s"%(bs.name,bs.color)) bs.eat() bs.setNewName("汤姆猫") bs.run()
运行结果为:
bs的名字是:波斯猫,颜色是:白色 波斯猫:在吃 汤姆猫:在跑
相关推荐:《Python视频教程》
说明:
1.虽然子类没有定义__init__()方法,但是父类有。所以在子类集成父类的时候这个方法就被继承了,所以只要创建Bosi的对象,就默认执行了那个继承过来的__init__()方法。
2.子类在继承的时候,在定义类时,小括号()中为父类的名字。
3.父类的所有非私有的属性、方法、会被继承给子类。
注意:
1.私有的属性,不能通过对象直接访问,但是可以通过方法访问。
2.私有的方法,不能通过对象直接访问。
3.私有的属性、方法,不会被子类继承,也不能被访问。
4.一般情况下,私有的属性、方法都是不对外公布的,往往用来做内部的事情,起到安全的作用。
class Animal(object): def __init__(self, name = "动物",color = "白色"): self.__name = name self.color = color def __test1(self): print(self.__name) print(self.color) def test2(self): print(self.__name) print(self.color) class Dog(Animal): def dogTest1(self): #不能访问父类的私有属性:AttributeError: 'Animal' object has no attribute '__name' #print(self.__name) print(self.color) def dogTest2(self): #self.__test1() self.test2() A = Animal() #print(A.__name) print(A.color) #不能访问父类的私有方法:AttributeError: 'Animal' object has no attribute '__test1' #A.__test1() A.test2() print("-----------------分割线-----------------") D = Dog(name="阿黄",color = "黄色") D.dogTest1() D.dogTest2()
运行结果为:
白色 动物 白色 -----------------分割线----------------- 黄色 阿黄 黄色
三、多继承
从图中能够看出,所谓多继承,即子类有多个父类,并且具有它们的特征。
Python中多继承的格式如下:
class A: def printA(self): print("---A---") class B: def printB(self): print("---B---") #定义一个子类继承A,B class C(A,B): def printC(self): print("---C---") obj_C = C() obj_C.printA() obj_C.printB()
运行结果为:
---A--- ---B---
说明
1.python中是可以多继承的。
2.父类中的方法、属性,子类会继承。
3.如果多个父类中有同一个方法,谁写在前面就调用谁的方法。
class A: def printA(self): print("---A---") class B: def printB(self): print("---B---") #定义一个子类继承A,B class C(A,B): def printC(self): print("---C---") obj_C = C() obj_C.printA() obj_C.printB() #可以查看一个雷的对象搜索方法时的先后顺序 print(C.__mro__)
运行结果为:
---A--- ---B--- (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)