【发布时间】:2009-09-18 14:54:28
【问题描述】:
generic function 根据其所有参数的类型进行调度。程序员定义了一个函数的几个实现。在调用时根据其参数的类型选择正确的。这对于对象适应非常有用。 Python 有一些通用函数,包括len()。
这些包倾向于允许如下代码:
@when(int)
def dumbexample(a):
return a * 2
@when(list)
def dumbexample(a):
return [("%s" % i) for i in a]
dumbexample(1) # calls first implementation
dumbexample([1,2,3]) # calls second implementation
我最近一直在考虑的一个不太愚蠢的例子是需要用户的 Web 组件。集成商不需要特定的 Web 框架,只需编写如下内容:
class WebComponentUserAdapter(object):
def __init__(self, guest):
self.guest = guest
def canDoSomething(self):
return guest.member_of("something_group")
@when(my.webframework.User)
componentNeedsAUser(user):
return WebComponentUserAdapter(user)
Python 有一些通用函数实现。为什么我会选择其中一个而不是其他?该实现如何在应用程序中使用?
我熟悉 Zope 的zope.component.queryAdapter(object, ISomething)。程序员注册一个可调用适配器,该适配器将特定类的对象作为其参数并返回与接口兼容的内容。这是允许插件的有用方法。与猴子补丁不同,即使一个对象需要适应具有相同方法名称的多个接口,它也可以工作。
【问题讨论】:
-
len函数只是调用对象的__len__方法。这就是您所说的“通用”功能吗?如果是这样,那么具有这样行为的函数相对较少。你有别的想法吗?如果是这样,请选择一个更好的例子。 -
你说的是多态性吗?或者您是在谈论猴子修补现有类型以添加多态性?
-
看起来(基于 ? 和提供的维基百科链接)joeforker 正在寻求实现重载功能。我相信他指的是“通用”,因为该函数由 1 个名称调用,但根据传递的参数执行不同的代码。因此: my_function(a) -> execute function_a my_function(b) -> execute function_b 这是解析 **kwargs 以获取要执行的代码的更时尚的实现