面向对象三大特性之继承

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

注释的两种方式可以实现相同效果!

你可能感兴趣的:(面向对象三大特性之继承)