Python 学习笔记
一、类的多重继承
- Python 中支持多重继承,也就是我们可以为一个类同时制定多个父类
- 使用特殊方法
__bases__
可以获取当前类的所有父类,语法为:类名.__bases__
class A(object):
def text(self):
print('AAA')
class B(object):
def text2(self):
print('BBB')
class C(A,B):
pass
c = C()
c.text()
c.text2()
print(B.__bases__)
print(C.__bases__)
我们在开发的时候尽量不要用多重继承,因为会增加我们代码的复杂程度
如果多个父类中出现重名的方法,则会先在第一个父类中寻找,然后找第一个父类的父类 … , 再找第二个 …
如:
class S(object):
def text(self):
print('S 中的 text 方法')
class A(S):
def text2(self):
print('A 中的 text 方法')
class B(object):
def text(self):
print('B 中的 text 方法')
class D(A):
def text2(self):
print('D 中的 text2 方法')
class C(D,B):
pass
c = C()
c.text()
二、类的多态
- 多态也是面向对象的三大特性之一
- 一个对象可以以不同的型态去呈现
2.1、先看一个多态的应用
s = "字符串"
lis = ['1','2','3','4','5']
print(len(s)) # len() 能被字符串调用
print(len(lis)) # len() 也能被列表调用
这个就是多态的一种提现,它关注的不是对象本身的类型,而是关注它是怎么使用的
2.2、用一下
class Brig:
name = 'Brig'
def run(self,n):
print("%s在走路..." % n)
class Cat:
name = 'Cat'
def run(self,n):
print("%s在走路..." % n)
class Snake:
name = 'Snake'
def run2(self,n):
print("%s在走路..." % n)
def Do(obj):
obj.run(obj.name)
c = Cat()
Do(c) # 只要对象中有 run() 就可以正常输出, Do 的 obj 对象以 Cat 的型态表示
Do(Brig()) # 只要对象中有 run() 就可以正常输出, Do 的 obj 对象以 Brig 的型态表示
# Do(Snake()) # Snake 中没有 run() 所以报错了
2.3、多态有什么好处
- 保证了程序的灵活性
class Brig:
name = 'Brig'
def run(self,n):
print("%s在走路..." % n)
class Cat:
name = 'Cat'
def run(self,n):
print("%s在走路..." % n)
def Do2(obj):
# 做类型检测
# 违反了多态的函数只适用于一种类型的对象(如这里只适用 Brig 对象),无法处理其他类型的对象,这样会导致函数的实用性非常差
if isinstance(obj,Brig):
print('你好 %s'%obj.name)
Do2(Brig())
Do2(Cat()) # 无法处理没有输出
2.4、len() 为啥能实现多态
- 之所以一个对象能够通过len()函数获取长度,是因为对象中具有一个特殊方法
__len__
class Brig:
name = 'Brig'
def run(self,n):
print("%s在走路..." % n)
def __len__(self): # 其实一般不这么写,这里就是方便实验
return 10
print(len(Brig()))
三、面向对象的三大特征
- 封装: 确保对象中数据的安全;
- 继承: 保证了对象的可扩展性;
- 多态: 保证了程序的灵活性。