面向对象 —— 多重继承 与 多态

本文探讨Python中的面向对象特性,主要聚焦在多重继承和多态。多重继承允许一个类从多个父类继承特性,但可能导致命名冲突。多态作为面向对象的三大特征之一,强调对象的多种形态和灵活性。文中还通过实例解释了多态的优势以及如何通过特殊方法实现多态,如len()函数的使用。
摘要由CSDN通过智能技术生成

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



三、面向对象的三大特征

  • 封装: 确保对象中数据的安全;
  • 继承: 保证了对象的可扩展性;
  • 多态: 保证了程序的灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值