《Python编程的术与道:Python语言进阶》视频课程
《Python编程的术与道:Python语言进阶》视频课程链接:https://edu.csdn.net/course/detail/28618
鸭子类型 (Duck Typing)
这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试。鸭子测试可以这样表述:如果走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If it walks like a duck and quacks like a duck, it must be a duck)。 在鸭子类型中,关注点在于对象的行为,能作什么;而不是关注对象所属的类型。
鸭子类型是编程语言中动态类型语言中的一种设计风格,一个对象的特征不是由父类决定,而是通过对象的方法决定的。
确定一个对象是否可以用于特定目的。 对于普通类型,是否适合取决于对象的类型。 在鸭子类型中,对象的适用性取决于某些方法和属性的存在,而不是对象本身的类型。
class Duck:
def fly(self):
print("Duck flying")
class Sparrow:
def fly(self):
print("Sparrow flying")
class Whale:
def swim(self):
print("Whale swimming")
for animal in Duck(), Sparrow(), Whale():
animal.fly()
Duck flying
Sparrow flying
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-1-9e3c261f187d> in <module>
12
13 for animal in Duck(), Sparrow(), Whale():
---> 14 animal.fly()
AttributeError: 'Whale' object has no attribute 'fly'
class Pycharm:
def execute(self):
print("Compiling")
print("Running")
class MyEditor:
def execute(self):
print("Spell Check")
print("Convention Check")
print("Compiling")
print("Running")
class Laptop:
def code(self,ide):
ide.execute()
ide = Pycharm()
lap1 = Laptop()
lap1.code(ide)
Compiling
Running
ide = MyEditor()
lap2 = Laptop()
lap2.code(ide)
Spell Check
Convention Check
Compiling
Running
我们可以使用一个函数 code()
来访问不同类中的相同方法。对于code()
函数来说,传入的参数并不一定需要是特定类型的,只需要保证传入的对象有一个 execute()
方法即可,它并不要求严格的继承体系