Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法在Python中获得特殊多态性?_Python_Types_Polymorphism_Adhoc Polymorphism - Fatal编程技术网

有没有办法在Python中获得特殊多态性?

有没有办法在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

许多语言都支持开箱即用(又称函数重载)。然而,Python似乎选择了退出。不过,我可以想象,可能有一个技巧或库能够在Python中实现它。有人知道这样的工具吗

例如,在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中如何实现类似的功能?

这是否算作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的例子