2017-07-30 16:44:51 +00:00
|
|
|
|
# 五、类的继承 #
|
|
|
|
|
|
|
|
|
|
## 1、定义类的继承 ##
|
|
|
|
|
|
|
|
|
|
首先我们来看下类的继承的基本语法:
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
class ClassName(BaseClassName):
|
|
|
|
|
<statement-1>
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
<statement-N>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
在定义类的时候,可以在括号里写继承的类,一开始也提到过,如果不用继承类的时候,也要写继承 object 类,因为在 Python 中 object 类是一切类的父类。
|
|
|
|
|
|
|
|
|
|
当然上面的是单继承,Python 也是支持多继承的,具体的语法如下:
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
class ClassName(Base1,Base2,Base3):
|
|
|
|
|
<statement-1>
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
<statement-N>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
多继承有一点需要注意的:若是父类中有相同的方法名,而在子类使用时未指定,python 在圆括号中父类的顺序,从左至右搜索 , 即方法在子类中未找到时,从左到右查找父类中是否包含方法。
|
|
|
|
|
|
|
|
|
|
那么继承的子类可以干什么呢?
|
|
|
|
|
|
|
|
|
|
继承的子类的好处:
|
|
|
|
|
* 会继承父类的属性和方法
|
|
|
|
|
* 可以自己定义,覆盖父类的属性和方法
|
|
|
|
|
|
|
|
|
|
## 2、调用父类的方法 ##
|
|
|
|
|
|
|
|
|
|
一个类继承了父类后,可以直接调用父类的方法的,比如下面的例子,`UserInfo2` 继承自父类 `UserInfo` ,可以直接调用父类的 `get_account` 方法。
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
#!/usr/bin/env python
|
|
|
|
|
# -*- coding: UTF-8 -*-
|
|
|
|
|
|
|
|
|
|
class UserInfo(object):
|
|
|
|
|
lv = 5
|
|
|
|
|
|
|
|
|
|
def __init__(self, name, age, account):
|
|
|
|
|
self.name = name
|
|
|
|
|
self._age = age
|
|
|
|
|
self.__account = account
|
|
|
|
|
|
|
|
|
|
def get_account(self):
|
|
|
|
|
return self.__account
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UserInfo2(UserInfo):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
userInfo2 = UserInfo2('两点水', 23, 347073565);
|
|
|
|
|
print(userInfo2.get_account())
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 3、父类方法的重写 ##
|
|
|
|
|
|
|
|
|
|
当然,也可以重写父类的方法。
|
|
|
|
|
|
|
|
|
|
示例:
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
# -*- coding: UTF-8 -*-
|
|
|
|
|
|
|
|
|
|
class UserInfo(object):
|
|
|
|
|
lv = 5
|
|
|
|
|
|
|
|
|
|
def __init__(self, name, age, account):
|
|
|
|
|
self.name = name
|
|
|
|
|
self._age = age
|
|
|
|
|
self.__account = account
|
|
|
|
|
|
|
|
|
|
def get_account(self):
|
|
|
|
|
return self.__account
|
|
|
|
|
|
|
|
|
|
@classmethod
|
|
|
|
|
def get_name(cls):
|
|
|
|
|
return cls.lv
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def get_age(self):
|
|
|
|
|
return self._age
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UserInfo2(UserInfo):
|
|
|
|
|
def __init__(self, name, age, account, sex):
|
|
|
|
|
super(UserInfo2, self).__init__(name, age, account)
|
|
|
|
|
self.sex = sex;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
userInfo2 = UserInfo2('两点水', 23, 347073565, '男');
|
|
|
|
|
# 打印所有属性
|
|
|
|
|
print(dir(userInfo2))
|
|
|
|
|
# 打印构造函数中的属性
|
|
|
|
|
print(userInfo2.__dict__)
|
|
|
|
|
print(UserInfo2.get_name())
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
最后打印的结果:
|
|
|
|
|
|
2017-12-22 08:14:43 +00:00
|
|
|
|

|
2017-07-30 16:44:51 +00:00
|
|
|
|
|
|
|
|
|
这里就是重写了父类的构造函数。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 3、子类的类型判断 ##
|
|
|
|
|
|
|
|
|
|
对于 class 的继承关系来说,有些时候我们需要判断 class 的类型,该怎么办呢?
|
|
|
|
|
|
|
|
|
|
可以使用 `isinstance()` 函数,
|
|
|
|
|
|
|
|
|
|
一个例子就能看懂 `isinstance()` 函数的用法了。
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
# -*- coding: UTF-8 -*-
|
|
|
|
|
|
|
|
|
|
class User1(object):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class User2(User1):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class User3(User2):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
|
user1 = User1()
|
|
|
|
|
user2 = User2()
|
|
|
|
|
user3 = User3()
|
|
|
|
|
# isinstance()就可以告诉我们,一个对象是否是某种类型
|
|
|
|
|
print(isinstance(user3, User2))
|
|
|
|
|
print(isinstance(user3, User1))
|
|
|
|
|
print(isinstance(user3, User3))
|
|
|
|
|
# 基本类型也可以用isinstance()判断
|
|
|
|
|
print(isinstance('两点水', str))
|
|
|
|
|
print(isinstance(347073565, int))
|
|
|
|
|
print(isinstance(347073565, str))
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
输出的结果如下:
|
|
|
|
|
|
|
|
|
|
```txt
|
|
|
|
|
True
|
|
|
|
|
True
|
|
|
|
|
True
|
|
|
|
|
True
|
|
|
|
|
True
|
|
|
|
|
False
|
|
|
|
|
```
|
|
|
|
|
|
2017-12-22 08:14:43 +00:00
|
|
|
|
可以看到 `isinstance()` 不仅可以告诉我们,一个对象是否是某种类型,也可以用于基本类型的判断。
|