面向对象三大特性之继承

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

注释的两种方式能够实现相同效果!接口

相关文章
相关标签/搜索