Home Python的继承
Post
Cancel

Python的继承

面向对象的编程带来的主要好处之一是代码的重用。假如需要定义几个类,而类与类之间有一些公共的属性和方法,这时就可以把相同的属性和方法作为基类的成员,而特殊的方法及属性则在本类中定义。这样子类只需要继承基类(父类),子类就可以访问到基类(父类)的属性和方法了,从而提高代码的可扩展性和重用性。

Python的继承是一个比较基础的内容,以往存在一些理解不明确的地方,因此做了一个简单学习整理,本页是我在这个过程的笔记。

继承的原理框架

参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class BaseClass:
    def __init__(self, base_param):
        # do some initialization
        self.base_param = base_param

class SubClass(BaseClass):
    def __init__(self, base_param, sub_param):   # this __init__ will overwrite the one of BaseClass
        # to inherit the attributes from base class, we should call __init__() of BaseClass explicitly, There are several ways:

        # way 1. This way is recommanded
        super().__init__(base_param)  

        # way 2. in Python3, it is equivalent to way 1. But in Python2, we are stuck with this form
        super(SubClass, self).__init__(base_param) 

        # way 3.
        BaseClass.__init__(self, base_param)
        
        # add new attrbites for sub class
        self.sub_param = sub_param

一个demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Animal:
    def __init__(self, name):
        self.name = name
    
    def talk(self):
        raise NotImplementedError

class Dog(Animal):
    def __init__(self, name):
        super().__init__(name)
        # super(Dog, self).__init__(name)
        # Animal.__init__(self, name)
    
    def talk(self):
        print("我叫 {}, 我会 {}".format(self.name, "汪汪"))

class Cat(Animal):
    def __init__(self, name):
        super().__init__(name)
    
    def talk(self):
        print("我叫 {}, 我会 {}".format(self.name, "喵喵"))
        
dog = Dog(name="狗狗")
cat = Cat(name="猫猫")

dog.talk()
cat.talk()

输出

1
2
我叫 狗狗, 我会 汪汪
我叫 猫猫, 我会 喵喵

同时继承多个类

一个子类允许同时继承多个父类。如果子类调用的方法为两个父类公有的方法,则遵循“先来后到”原则,即调用排列在前面的父类对应的方法。参考

其他

关于isinstance()type()的区别

isinstance()会认为子类是一种父类类型,考虑继承关系;type()不会认为子类是一种父类类型,不考虑继承关系。参考

假设已经按照上面的demo创建了dogcat两个对象,则有

1
2
print(isinstance(dog, Animal))  # True
print(type(dog) == Animal)      # False
This post is licensed under CC BY 4.0 by the author.

tensorboard使用

ACM格式输入输出总结