对继承的理解:将共性的内容放在父类中,子类只需要关注自己特有的内容
在程序中,继承描述的是事物之间的所属关系,例如猫和狗都属于动物,程序中便可以描述为猫和狗继承自动物;同理,波斯猫和巴厘猫都继承自猫,而沙皮狗和斑点狗都继承足够,如下如所示:
1.1.1继承示例
#定义一个父类,如下:
classCat(object):
def__init__(self, name, color="白色"):
self.name = name
self.color = color
defrun(self):
print("%s--在跑"%self.name)
#定义一个子类,继承Cat类如下:
classBosi(Cat):
defsetNewName(self, newName):
self.name = newName
defeat(self):
print("%s--在吃"%self.name)
bs = Bosi("印度猫")
print('bs的名字为:%s'%bs.name)
print('bs的颜色为:%s'%bs.color)
bs.eat()
bs.setNewName('波斯')
bs.run()
运行结果:
说明:
虽然子类没有定义__init__方法,但是父类有,所以在子类继承父类的时候这个方法就被继承了,所以只要创建Bosi的对象,就默认执行了那个继承过来的__init__方法
总结
子类在继承的时候,在定义类时,小括号()中为父类的名字
父类的属性、方法,会被继承给子类
1.1.2注意点
classAnimal(object):
def__init__(self, name='动物', color='白色'):
self.__name = name
self.color = color
def__test(self):
print(self.__name)
print(self.color)
deftest(self):
print(self.__name)
print(self.color)
classDog(Animal):
defdogTest1(self):
#print(self.__name) #不能访问到父类的私有属性
print(self.color)
defdogTest2(self):
#self.__test() #不能访问父类中的私有方法
self.test()
A = Animal()
#print(A.__name) #程序出现异常,不能访问私有属性
print(A.color)
#A.__test() #程序出现异常,不能访问私有方法
A.test()
print("------分割线-----")
D = Dog(name ="小花狗", color ="黄色")
D.dogTest1()
D.dogTest2()
总结
·私有的属性,不能通过对象直接访问,但是可以通过方法访问
·私有的方法,不能通过对象直接访问
·私有的属性、方法,不会被子类继承,也不能被访问
·一般情况下,私有的属性、方法都是不对外公布的,往往用来做内部的事情,起到安全的作用
1.2多继承
从图中能够看出,所谓多继承,即子类有多个父类,并且具有它们的特征
Python中多继承的格式如下:
#定义一个父类
classA:
defprintA(self):
print('----A----')
#定义一个父类
classB:
defprintB(self):
print('----B----')
#定义一个子类,继承自A、B
classC(A,B):
defprintC(self):
print('----C----')
obj_C = C()
obj_C.printA()
obj_C.printB()
运行结果:
----A----
----B----
说明
·python中是可以多继承的,在java中叫接口
·父类中的方法、属性,子类会继承
注意点
·想一想:
如果在上面的多继承例子中,如果父类A和父类B中,有一个同名的方法,那么通过子类去调用的时候,调用哪个?
#coding=utf-8
classbase(object):
deftest(self):
print('----base test----')
classA(base):
deftest(self):
print('----A test----')
#定义一个父类
classB(base):
deftest(self):
print('----B test----')
#定义一个子类,继承自A、B
classC(A,B):
pass
obj_C = C()
obj_C.test()
print(C.__mro__)#可以查看C类的对象搜索方法时的先后顺序
1.3重写父类方法与调用父类方法
1.3.1重写父类方法
所谓重写,就是子类中,有一个和父类相同名字的方法,在子类中的方法会覆盖掉父类中同名的方法
#coding=utf-8
classCat(object):
defsayHello(self):
print("halou-----1")
classBosi(Cat):
defsayHello(self):
print("halou-----2")
bosi = Bosi()
bosi.sayHello()
1.3.2调用父类的方法
#coding=utf-8
classCat(object):
def__init__(self,name):
self.name = name
self.color ='yellow'
classBosi(Cat):
def__init__(self,name):
#调用父类的__init__方法1(python2)
#Cat.__init__(self,name)
#调用父类的__init__方法2
#super(Bosi,self).__init__(name)
#调用父类的__init__方法3
super().__init__(name)
defgetName(self):
returnself.name
bosi =
Bosi('xiaohua')
print(bosi.name)
print(bosi.color)