1:繼承,顧名思義就是子代繼承父輩的一些東西,在程序中也就是子類繼承父類的屬性和方法醒叁。
1 #Author : Kelvin
2 #Date : 2019/1/16 18:57
3
4 class Father:
5? ? money=1000
6
7? ? def __init__(self,name):
8? ? ? ? print("父類的init方法...")
9? ? ? ? self.name=name
10
11? ? def teach(self):
12? ? ? ? print("%s 正在教兒子學(xué)習(xí)..."%self.name)
13
14 class Son(Father):
15? ? pass
16
17
18 s=Son("kelvin")
19 print(s)
20 #>>>: 父類的init方法...
21 #>>>: <__main__.Son object at 0x0000018B1A1AEEB8>
22 s.teach()
23 # >>>: kelvin 正在教兒子學(xué)習(xí)...
可見灾炭,即使Son類沒有定義init方法,money屬性和teach方法讹剔,但是由于Son類繼承了Father類怕轿,所以在實(shí)例化Son時(shí)可以使用父類的屬性值和方法。
誤區(qū):如果子類存在與父類同名的屬性和方法辟拷,并不是覆蓋了從父類繼承的屬性撞羽。因?yàn)樽宇悤?huì)先從本類開始找對(duì)應(yīng)方法,如果沒有再去父類調(diào)用衫冻。
歸一化設(shè)計(jì)(接口繼承):
使用繼承的最大作用就是定義一種規(guī)范诀紊。讓繼承者按照規(guī)范進(jìn)行書寫代碼。
第一種:普通類繼承隅俘。缺點(diǎn):不能限制子類根據(jù)父類的規(guī)范定義函數(shù)邻奠。
1 #Author : Kelvin
2 #Date : 2019/1/16 19:53
3
4 class Basic():
5
6? ? def eat(self):
7? ? ? ? pass
8? ?
9? ? def drink(self):
10? ? ? ? pass
11
12 class People(Basic):
13? ? def __init__(self,name):
14? ? ? ? self.name=name
15? ? def eat(self):
16? ? ? ? print("%s吃飯"%self.name)
17? ? def drink(self):
18? ? ? ? print("%s喝水"%self.name)
19
20 class Cat(Basic):
21? ? def __init__(self,name):
22? ? ? ? self.name=name
23? ? def eat(self):
24? ? ? ? print("%s吃飯"%self.name)
25
26 c=Cat("貓咪")
27 c.eat()
28 c.drink()
很明顯,代碼可以執(zhí)行为居,說明子類即使不按照父類定義的標(biāo)準(zhǔn)執(zhí)行碌宴,也不會(huì)報(bào)錯(cuò)。很明顯父類不能起到規(guī)定的作用蒙畴。接下來可以使用這種實(shí)現(xiàn):
1 #Author : Kelvin
2 #Date : 2019/1/16 19:53
3 import abc
4 class Basic(metaclass=abc.ABCMeta):
5? ? @abc.abstractmethod
6? ? def eat(self):
7? ? ? ? pass
8? ? @abc.abstractmethod
9? ? def drink(self):
10? ? ? ? pass
11
12 class People(Basic):
13? ? def __init__(self,name):
14? ? ? ? self.name=name
15? ? def eat(self):
16? ? ? ? print("%s吃飯"%self.name)
17? ? def drink(self):
18? ? ? ? print("%s喝水"%self.name)
19
20 class Cat(Basic):
21? ? def __init__(self,name):
22? ? ? ? self.name=name
23? ? def eat(self):
24? ? ? ? print("%s吃飯"%self.name)
25
26 c=Cat("貓咪")
27 c.eat()
28 c.drink()
此時(shí)贰镣,由于Cat類繼承了Basic呜象,但是由于Basic類做了限制,繼承Basic類必須實(shí)現(xiàn)所有Basic中的方法碑隆,但是Cat中只實(shí)現(xiàn)了部分方法恭陡,因此程序報(bào)錯(cuò)。
如果在子類中定義了和父類同名的屬性和成員方法時(shí)上煤,如何才能調(diào)用父類屬性和方法呢休玩?
1 #Author : Kelvin
2 #Date : 2019/1/16 20:45
3
4 class way:
5? ? def __init__(self,name,speed):
6? ? ? ? self.name=name
7? ? ? ? self.speed=speed
8? ? def run(self):
9? ? ? ? print("所有交通工具!")
10
11 class subway(way):
12? ? def __init__(self,name,speed,line):
13? ? ? ? # way.__init__(self,name,speed)
14? ? ? ? # super(subway, self).__init__()
15? ? ? ? super().__init__(name,speed)
16? ? ? ? self.line=line
17? ? def run(self):
18? ? ? ? # way.run(self)
19? ? ? ? # super(subway, self).run()
20? ? ? ? super().run()
21? ? ? ? print("地鐵交通工具劫狠!")
22
23 s=subway("徐州地鐵","10km/min","13號(hào)線路")
24 s.run()
注釋的兩種方式可以實(shí)現(xiàn)相同效果拴疤!