繁体   English   中英

Python中内置类型的多态性

[英]Polymorphism with built-in types in Python

我在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实例。

如果不了解你正在做什么,我会继续并同意你的陈述

也许我只是通过一个将类实例与内置类型混合在一起的集合来犯错误

如果你只需要比较内置数字和你的属性实例之间的符号,它就不会那么大(使用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))

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

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

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

- 如果你建议你可以为Property定义一个新的构造函数来获取内置的,

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

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

请为列表中的对象提供适当的共享接口。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM