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()
很明显,代码可以执行,说明子类即使不按照父类定义的标准执行,也不会报错。很明显父类不能起到规定的作用。接下来可以使用这种实现:
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()
注释的两种方式可以实现相同效果!
网友评论