一、鸭子类型
鸭子类型(英语:duck typing)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定
“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”
我们并不关心对象是什么类型,到底是不是鸭子,只关心行为
鸭子类型在动态语言中经常使用,非常灵活,使得python不想java那样专门去弄一大堆的设计模式
二、代码实现
1.鸭子类型1
class Duck:
def quack(self):
print("嘎嘎嘎嘎。。。。。")
class Bird:
def quack(self):
print("bird imitate duck....")
class geese:
def quack(self):
print("doge imitate duck....")
def in_the_forest(duck):
duck.quack()
duck = Duck()
bird = Bird()
doge = geese()
for x in [duck, bird, doge]:
in_the_forest(x)
运行结果:
嘎嘎嘎嘎。。。。。
bird imitate duck....
doge imitate duck....
鸭子类型要求每个class要有相同的方法
def in_the_forest(duck):
duck.quack()
2.鸭子类型2
class duck():
def walk(self):
print('I walk, i am a duck')
def swim(self):
print('i swim,i am a duck')
class geese():
def walk(self):
print('i walk like a duck')
def swim(self):
print('i swim like a duck')
class person():
def walk(self):
print('this one walk like a duck')
def swim(self):
print('this one walk like a duck')
def watch_duck(a):
a.walk()
a.swim()
small_duck = duck()
watch_duck(small_duck)
duck_like_geese = geese()
watch_duck(duck_like_geese)
duck_like_man = person()
watch_duck(duck_like_man)
运行结果:
I walk, i am a duck
i swim,i am a duck
i walk like a duck
i swim like a duck
this one walk like a duck
this one walk like a duck
从上面可以看出,只要有watch_duck函数接收这个类的对象,然后并没有检查对象的类型,而是直接调用这个对象的walk和swim方法,
从上面可以看出,python鸭子类型的灵活性在于它关注的是这个所调用的对象是如何被使用的,而没有关注对象类型的本身是什么
3.鸭子类型3
# 执行测试用例的类
class BaseRun:
def run(self):
print("运作测试用例,生成txt格式的测试报告")
class HtmlRun(BaseRun):
def run(self):
print("运作测试用例,生成HTML格式的测试报告")
#
class XMLRun(BaseRun):
def run(self):
print("运作测试用例,生成XML格式的测试报告")
#
#
class JsonRun(BaseRun):
def run(self):
print("运作测试用例,生成JsonRun格式的测试报告")
#
def main(obj: BaseRun):
"""测试执行的启动函数"""
# 此处省略若干行业务代码
obj.run()
if __name__ == '__main__':
b_obj = BaseRun()
main(b_obj)
html_obj = HtmlRun()
main(html_obj)
json_obj = JsonRun()
main(json_obj)
xml_json = XMLRun()
main(xml_json)
运行结果:
运作测试用例,生成txt格式的测试报告
运作测试用例,生成HTML格式的测试报告
运作测试用例,生成JsonRun格式的测试报告
运作测试用例,生成XML格式的测试报告