面向对象的编程带来的主要好处之一是代码的重用。假如需要定义几个类,而类与类之间有一些公共的属性和方法,这时就可以把相同的属性和方法作为基类的成员,而特殊的方法及属性则在本类中定义。这样子类只需要继承基类(父类),子类就可以访问到基类(父类)的属性和方法了,从而提高代码的可扩展性和重用性。
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创建了dog
和cat
两个对象,则有
1
2
print(isinstance(dog, Animal)) # True
print(type(dog) == Animal) # False