面向對象三大特性之繼承

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 正在教兒子學習..."%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 正在教兒子學習...

可見,即便Son類沒有定義init方法,money屬性和teach方法,可是因爲Son類繼承了Father類,因此在實例化Son時能夠使用父類的屬性值和方法。函數

誤區:若是子類存在與父類同名的屬性和方法,並非覆蓋了從父類繼承的屬性。由於子類會先從本類開始找對應方法,若是沒有再去父類調用。

 

歸一化設計(接口繼承):

  使用繼承的最大做用就是定義一種規範。讓繼承者按照規範進行書寫代碼。工具

  第一種:普通類繼承。缺點:不能限制子類根據父類的規範定義函數。學習

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()

很明顯,代碼能夠執行,說明子類即便不按照父類定義的標準執行,也不會報錯。很明顯父類不能起到規定的做用。接下來能夠使用這種實現:spa

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()

此時,因爲Cat類繼承了Basic,可是因爲Basic類作了限制,繼承Basic類必須實現全部Basic中的方法,可是Cat中只實現了部分方法,所以程序報錯。設計

 

若是在子類中定義了和父類同名的屬性和成員方法時,如何才能調用父類屬性和方法呢?繼承

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號線路")
24 s.run()

註釋的兩種方式能夠實現相同效果!接口

相關文章
相關標籤/搜索