2015-10-16 67 views
0

许多语言支持ad-hoc polymorphism(也称为函数重载)开箱即用。但是,Python似乎没有选择它。不过,我可以想象,可能有一个技巧或者一个能够在Python中实现的技巧。有谁知道这样的工具?有没有办法在Python中获得ad-hoc多态性?

例如,在Haskell一个可能用它来生成测试数据,不同的类型:

-- In some testing library: 
class Randomizable a where 
    genRandom :: a 

-- Overload for different types 
instance Randomizable String where genRandom = ... 
instance Randomizable Int where genRandom = ... 
instance Randomizable Bool where genRandom = ... 


-- In some client project, we might have a custom type: 
instance Randomizable VeryCustomType where genRandom = ... 

这样做的好处是,我可以延长genRandom为自己的自定义类型不接触测试库。

你会如何在Python中实现这样的东西?

+0

提供一个你想到的或者它会如何帮助你的例子。 – Spaceghost

+0

我添加了一个例子。希望这会赢得你的回票。 –

+1

Python对方法没有强类型参数。只需要一个方法来检查输入的类型并作出相应的反应。同样的效果,不是吗? – RobertB

回答

3

Python是不是一个强类型语言,所以如果真的有溜溜的随机化的实例或具有相同方法的一些其他类的实例并不重要。

一种方式来获得你想要的可能是这个东西的出现:

types_ = {} 
def registerType (dtype , cls) : 
    types_[dtype] = cls 
def RandomizableT (dtype) : 
    return types_[dtype] 

首先,是的,我做了定义一个大写字母的功能,但它的意思更像一个类。例如:

registerType (int , TheLibrary.Randomizable) 
registerType (str , MyLibrary.MyStringRandomizable) 

然后,后来:

type = ... # get whatever type you want to randomize 
randomizer = RandomizableT(type)() 
print randomizer.getRandom() 
+0

这正是我所需要的。它允许原始测试库为我的自定义类型生成随机数据,而无需修改库。 –

0

这是否适用于ad hock多态性?

class A: 
    def __init__(self): 
     pass 

    def aFunc(self): 
     print "In A" 

class B: 
    def __init__(self): 
     pass 

    def aFunc(self): 
     print "In B" 

f = A() 
f.aFunc() 
f = B() 
f.aFunc() 

输出

+0

这只是动态打字。 –

+0

您可以使用方法调用绘图编写两个对象,这会绘制对象。一个物体会画一个圆圈,另一个是方形的。这是一个非常常见的面向对象的例子。我的动态类型示例是在python中实现的一种在C++中不可用的方式。不处理子类型。 –

+0

在你的例子中,为了使用它们,我必须知道'A'和'B'。我的示例代码背后的想法是'genRandom'的用户不需要知道它正在处理的类型。这意味着一个库可以将它和'genRandom'数据调用为库不知道的类型。 –

0

多态性的另一个版本

from module import aName 

如果两个模块使用相同的接口,你可以输入任何一个在使用它你码。 这方面的一个例子是from xml.etree.ElementTree import XMLParser

相关问题