Python中内置类型的多态性

时间:2011-12-28 13:41:08

标签: python polymorphism

我在Python中有一些变量集合,其中一些是普通的Python数字,其中一些是我编写的一个名为Property的类的实例,它表示一系列可能的值(例如0到4.2之间)。我想迭代这个集合并根据每个项目是内置数字还是属性来执行不同的操作。当然,我可以通过显式检查类型来做到这一点,但我想知道是否有一种干净的,面向对象的,惯用的方式来在Python中完成它。

例如,我想要做的事情之一取决于集合条目的符号,所以我想编写一个函数来返回其参数的符号,无论它是通过内置类型还是属性。我可以向Property添加__sign__方法,但内置数值类型没有__sign__方法,Python也不允许我添加一个,所以这没有帮助。

也许我只是通过一个将类实例与内置类型混合在一起的集合来犯错误 - 但改变它会使我的代码界面变得混乱。而不是写

myList = [0, 2.3, 4, Property(0,2)]

我必须写类似

的内容
myList = [Property(0), Property(2.3), Property(4), Property(0,2)]

我希望尽可能避免。

以下是有关我正在尝试做的更多信息。我正在研究一个涉及跟踪许多变量的科学问题,这些变量以特定的方式相互关联。很多这些变量都有已知的值(因为它们已被测量)但有些是未知的,有些已被测量但不准确,因此我们知道它们必须位于某个特定范围内。有些方程式可以指定这些变量之间的相互关系,最终我将使用数值优化库来查找未知变量的可能范围。

因为有很多变量我想在一个合理格式化的输入文件中存储有关它们的所有已知数据。虽然为了简单起见我想保留这个python文件,但为了我的缘故,保持其语法尽可能简单是非常重要的,因为它可能必须由非程序员读取或添加。目前它有很多行看起来像这样的东西:

a.set_some_parameters(3.2, -1, Property(2.3,2.5))
a.x = 0.1
b.x = Property.unknown()
a.set_some_other_parameters(Property.positive(), -4.2, 1, 0)

关键在于(几乎)你可以输入一个数字,你可以改为输入一个属性,如果这个值没有准确知道的话。这很适合作为一个接口,但最终我遇到了上述情况,我的代码不断处理某些内容可能是内置数字的事实,或者它可能是一个Property实例。

2 个答案:

答案 0 :(得分:1)

我不知道你在做什么,我会继续并同意你的陈述

  

也许我只是通过一个将类实例与内置类型混合的集合

来犯错误

如果你只需要比较内置数字和你的属性实例之间的符号,它就不会那么大(使用cmp函数并覆盖Property类上的比较运算符),但是我敢打赌,这不是你想做的全部。

相反,想一想构建列表的更好方法,如果那是你真正担心的事情。这是两个例子:

P = Property
myList = [P(0), P(2.3), P(4), P(0,2)]

# or...

def createPropertyList(*args):
    return [Property(x) for x in args]

myList = createPropertyList(0,2.3,4,(0,2))

答案 1 :(得分:0)

从设计的角度来看,你正在做一些奇怪的事情。如果你有一系列的东西,并且你想对它们采取行动,那么它们会分享一些东西!

所以,你应该考虑他们的共同界面应该是什么。

您有一些不同的解决方案:

- 如果你建议你可以为Property定义一个新的构造函数,它带有内置的

- 如果你希望你的对象仍然是一个整数,你可以创建一个整数的子类,

- 您还可以定义一个具有整数成员的新类,然后您可以定义 新类的方法,以便为整数定义适当的接口。 换句话说,您将整数包装在一个新类中。

请为列表中的对象提供适当的共享界面。