有没有办法在Python中获得特殊多态性?
许多语言都支持开箱即用(又称函数重载)。然而,Python似乎选择了退出。不过,我可以想象,可能有一个技巧或库能够在Python中实现它。有人知道这样的工具吗 例如,在Haskell中,可以使用它为不同类型生成测试数据:有没有办法在Python中获得特殊多态性?,python,types,polymorphism,adhoc-polymorphism,Python,Types,Polymorphism,Adhoc Polymorphism,许多语言都支持开箱即用(又称函数重载)。然而,Python似乎选择了退出。不过,我可以想象,可能有一个技巧或库能够在Python中实现它。有人知道这样的工具吗 例如,在Haskell中,可以使用它为不同类型生成测试数据: -- In some testing library: class Randomizable a where genRandom :: a -- Overload for different types instance Randomizable String wher
-- 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中如何实现类似的功能?这是否算作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()
输出
In A
In B
这是否算作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()
输出
In A
In B
Python不是一种强类型语言,所以不管你是否有一个Randomizable的实例,或者有一个具有相同方法的其他类的实例 获得所需外观的一种方法是:
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()
Python不是一种强类型语言,所以不管你是否有一个Randomizable的实例,或者有一个具有相同方法的其他类的实例 获得所需外观的一种方法是:
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()
多态性的另一个版本
from module import aName
如果两个模块使用相同的接口,您可以导入其中一个并在代码中使用它。
这方面的一个例子是另一个版本的多态性
from module import aName
如果两个模块使用相同的接口,您可以导入其中一个并在代码中使用它。
这方面的一个例子是xml.etree.ElementTree import XMLParser中的
Python函数不能基于静态编译时类型自动专门化。因此,它的结果只能取决于在运行时收到的参数和全局(或本地)环境,除非函数本身可以就地修改并且可以携带一些状态
您的泛型函数genRandom
除了输入信息外,不接受任何参数。因此,在Python中,它至少应该接收类型作为参数。由于内置类无法修改,因此此类类的通用函数(实例)实现应该通过全局环境提供,或者包含在函数本身中
我发现自从Python 3.4以来,就有了装饰器。但是,它仅适用于接收类型实例(对象)作为第一个参数的函数,因此不清楚如何在示例中应用它。我也有点困惑于它:
此外,Python代码目前常用的反模式是检查接收到的参数类型,以决定如何处理对象
我理解反模式是一个行话,指的是一种被认为不受欢迎的模式(并不意味着没有模式)。因此,其基本原理声称,检查类型的参数是不可取的,这一主张被用来证明引入一种工具可以简化。。。根据参数的类型进行分派。(顺便说一句,请注意根据“显式优于隐式”。)
然而,这一节似乎值得一读。对可能的解决方案有一些参考,包括Guido van Rossum 2005年的一篇文章。Python函数不能基于静态编译时类型自动专门化。因此,它的结果只能取决于在运行时收到的参数和全局(或本地)环境,除非函数本身可以就地修改并且可以携带一些状态 您的泛型函数
genRandom
除了输入信息外,不接受任何参数。因此,在Python中,它至少应该接收类型作为参数。由于内置类无法修改,因此此类类的通用函数(实例)实现应该通过全局环境提供,或者包含在函数本身中
我发现自从Python 3.4以来,就有了装饰器。但是,它仅适用于接收类型实例(对象)作为第一个参数的函数,因此不清楚如何在示例中应用它。我也有点困惑于它:
此外,Python代码目前常用的反模式是检查接收到的参数类型,以决定如何处理对象
我理解反模式是一个行话,指的是一种被认为不受欢迎的模式(并不意味着没有模式)。因此,其基本原理声称,检查类型的参数是不可取的,这一主张被用来证明引入一种工具可以简化。。。根据参数的类型进行分派。(顺便说一句,请注意根据“显式优于隐式”。)
然而,这一节似乎值得一读。这里有一些可能的解决方案的参考资料,包括Guido van Rossum在2005年发表的一篇文章。提供一个例子,说明您的想法或它将如何帮助您。我添加了一个例子。希望这能赢回你的选票。Python没有方法的强类型参数。只有一个方法可以检查输入的类型并做出相应的反应。相同的效果,否?@RobertB如果您这样做,那么您的案例将“关闭”,您必须修改原始方法以添加新类型。这就是我试图避免的,也是特设多态性的主要好处。你真的需要包括你打算如何使用你想要的任何东西的例子。说“Haskell可以做到这一点:”没有帮助,因为语法是不同的。你到底想做什么?举一个wha的例子