對繼承的理解:將共性的內(nèi)容放在父類中艰争,子類只需要關(guān)注自己特有的內(nèi)容
在程序中,繼承描述的是事物之間的所屬關(guān)系桂对,例如貓和狗都屬于動(dòng)物甩卓,程序中便可以描述為貓和狗繼承自動(dòng)物;同理蕉斜,波斯貓和巴厘貓都繼承自貓逾柿,而沙皮狗和斑點(diǎn)狗都繼承足夠缀棍,如下如所示:
1.1.1繼承示例
#定義一個(gè)父類,如下:
classCat(object):
def__init__(self, name, color="白色"):
self.name = name
self.color = color
defrun(self):
print("%s--在跑"%self.name)
#定義一個(gè)子類机错,繼承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()
運(yùn)行結(jié)果:
說明:
雖然子類沒有定義__init__方法爬范,但是父類有,所以在子類繼承父類的時(shí)候這個(gè)方法就被繼承了弱匪,所以只要?jiǎng)?chuàng)建Bosi的對象青瀑,就默認(rèn)執(zhí)行了那個(gè)繼承過來的__init__方法
總結(jié)
子類在繼承的時(shí)候,在定義類時(shí)萧诫,小括號()中為父類的名字
父類的屬性斥难、方法,會(huì)被繼承給子類
1.1.2注意點(diǎn)
classAnimal(object):
def__init__(self, name='動(dòng)物', 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) #程序出現(xiàn)異常帘饶,不能訪問私有屬性
print(A.color)
#A.__test() #程序出現(xiàn)異常哑诊,不能訪問私有方法
A.test()
print("------分割線-----")
D = Dog(name ="小花狗", color ="黃色")
D.dogTest1()
D.dogTest2()
總結(jié)
·私有的屬性,不能通過對象直接訪問及刻,但是可以通過方法訪問
·私有的方法镀裤,不能通過對象直接訪問
·私有的屬性、方法缴饭,不會(huì)被子類繼承暑劝,也不能被訪問
·一般情況下,私有的屬性颗搂、方法都是不對外公布的担猛,往往用來做內(nèi)部的事情,起到安全的作用
1.2多繼承
從圖中能夠看出峭火,所謂多繼承毁习,即子類有多個(gè)父類,并且具有它們的特征
Python中多繼承的格式如下:
#定義一個(gè)父類
classA:
defprintA(self):
print('----A----')
#定義一個(gè)父類
classB:
defprintB(self):
print('----B----')
#定義一個(gè)子類卖丸,繼承自A纺且、B
classC(A,B):
defprintC(self):
print('----C----')
obj_C = C()
obj_C.printA()
obj_C.printB()
運(yùn)行結(jié)果:
----A----
----B----
說明
·python中是可以多繼承的,在java中叫接口
·父類中的方法稍浆、屬性载碌,子類會(huì)繼承
注意點(diǎn)
·想一想:
如果在上面的多繼承例子中,如果父類A和父類B中衅枫,有一個(gè)同名的方法嫁艇,那么通過子類去調(diào)用的時(shí)候,調(diào)用哪個(gè)弦撩?
#coding=utf-8
classbase(object):
deftest(self):
print('----base test----')
classA(base):
deftest(self):
print('----A test----')
#定義一個(gè)父類
classB(base):
deftest(self):
print('----B test----')
#定義一個(gè)子類步咪,繼承自A、B
classC(A,B):
pass
obj_C = C()
obj_C.test()
print(C.__mro__)#可以查看C類的對象搜索方法時(shí)的先后順序
1.3重寫父類方法與調(diào)用父類方法
1.3.1重寫父類方法
所謂重寫益楼,就是子類中猾漫,有一個(gè)和父類相同名字的方法点晴,在子類中的方法會(huì)覆蓋掉父類中同名的方法
#coding=utf-8
classCat(object):
defsayHello(self):
print("halou-----1")
classBosi(Cat):
defsayHello(self):
print("halou-----2")
bosi = Bosi()
bosi.sayHello()
1.3.2調(diào)用父類的方法
#coding=utf-8
classCat(object):
def__init__(self,name):
self.name = name
self.color ='yellow'
classBosi(Cat):
def__init__(self,name):
#調(diào)用父類的__init__方法1(python2)
#Cat.__init__(self,name)
#調(diào)用父類的__init__方法2
#super(Bosi,self).__init__(name)
#調(diào)用父類的__init__方法3
super().__init__(name)
defgetName(self):
returnself.name
bosi =
Bosi('xiaohua')
print(bosi.name)
print(bosi.color)