Python多态的核心机制与实战应用解析
本文深入解析Python中的多态机制,阐述其实现的两个核心前提:继承与方法重写。通过代码示例展示子类如何覆盖父类行为,并引入“鸭子类型”概念,说明Python通过接口而非具体类型实现多态的特性。文章涵盖多态在实际编程中的应用场景,帮助开发者理解动态绑定的执行逻辑。
前言部分简要引入主题,为后续关于Python多态的深入探讨做铺垫。
在Python中,多态的有效实现依赖于两个必要的前提条件。
- 首先,必须存在继承关系,即多态现象仅发生于子类与父类之间的层级结构中。
- 其次,子类必须对父类的方法进行重写(Override),这是多态行为产生的基础。
理解上述两点后,结合具体的代码示例可以更加直观地掌握多态的工作机制。
#多态的代码实例
class Farther:
def behavior(self,action):
print("父亲会%s" % action)
# 定义Son类继承Farther类
class Son(Farther):
def behavior(self,action):
print("儿子会%s" % action)
# 定义Grandson类继承Farther类
class Grandson(Farther):
def behavior(self,action):
print("孙子会%s" % action)
# 使用Farter类创建对象
# 程序在执行时才会确定behavior方法是属于哪一个对象的
f = Farther()
print(id(f))
f.behavior("吃饭") #父亲会吃饭
f = Son()
print(id(f))
f.behavior("吃饭") #儿子会吃饭
f = Grandson()
print(id(f))
f.behavior("吃饭") #孙子会吃饭
运行结果如下: 1603040478928 父亲会吃饭 1603040477584 孙子会吃饭 1603040478928 儿子会吃饭
分析上述代码示例可知,Son和Grandson两个子类均继承了Farther类,并各自重写了父类中的behavior方法。从运行结果可以看出,当同一个对象引用f指向不同的实例时,尽管调用的函数名和参数完全相同,但程序在运行时会根据f当前指向的具体实例对象,动态决定执行哪个behavior()方法。这种根据对象类型自动选择执行代码的机制,即为多态性。
# 多态的应用
class IceCream:
def make_icecream(self,taste):
print("寻找不同口味的冰淇淋...")
taste.make(self)
# 定义抹茶味的冰淇淋和方法
class Tea:
def make(self,make_icecream):
print('%s 正在调用抹茶的制作方法' % make_icecream)
class Orange:
def make(self,make_icecream):
print('%s 正在调用抹茶的制作方法' % make_icecream)
class Apple:
def make(self,make_icecream):
print('%s 正在调用抹茶的制作方法' % make_icecream)
i = IceCream()
# 抹茶味
i.make_icecream(Tea())
# 橘子味
i.make_icecream(Orange())
#苹果味
i.make_icecream(Apple())
# 执行结果 寻找不同口味的冰淇淋... <__main__.IceCream object at 0x000002700CF086D0> 正在调用抹茶的制作方法 寻找不同口味的冰淇淋... <__main__.IceCream object at 0x000002700CF086D0> 正在调用抹茶的制作方法 寻找不同口味的冰淇淋... <__main__.IceCream object at 0x000002700CF086D0> 正在调用抹茶的制作方法
接下来对代码逻辑进行解析。
观察上述代码可见,在调用IceCream类的make_icecream()方法时,程序并不关心传入的参数对象taste的具体类型是子类还是其他类,它仅要求该参数对象包含make()方法即可。Python通过这种“看行为而非看类型”的方式,实现了灵活的多态调用。
总结而言,多态的核心在于:不同的子类对象调用相同的父类方法时,会产生不同的执行结果。
这里的多态性是指,具有不同内部实现功能的函数可以使用相同的函数名。这使得开发者能够使用统一的函数名来调用不同内容的具体实现,提高了代码的通用性和可扩展性。
class Wechatpay:
def __init__(self, name, money):
self.name = name
self.money = money
def pay(self):
print('%s通过微信支付了%s元' % (self.name, self.money))
class Alipay:
def __init__(self, name, money):
self.name = name
self.money = money
def pay(self):
print('%s通过支付宝支付了%s元' % (self.name, self.money))
#这里的多态性体现是向同一个函数,传递不同参数后,可以实现不同功能.
def pay(person):
person.pay()
# 实列化对象
ali = Alipay("xiaoming", 100)
wch = Alipay("xiaohong", 100)
pay(ali)
pay(wch)
以上就是Python教程之Python多态的深层次理解的详细内容,更多关于Python多态理解的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









