我是一个新手,所以请原谅非标准术语,让我知道我是否应该添加代码,使这个问题更清楚。你知道吗
假设我们尝试在Python中创建一个类“Rational”。(我知道已经内置了一个,但在这个问题中忽略它。)
例如,我们可以使用__add__
和__mul__
来教Python如何解释a + b
或a * b
形式的代码
其中a
和b
是有理数。你知道吗
现在,可能会发生这样的情况,在其他地方,人们想要计算a + b
,其中a
是有理数,而b
是整数。这可以通过修改Rational类中的__add__
代码来实现,例如,包含if语句
def __add__(self, b):
if isinstance(b, int):
brat = rational(b, 1)
return self + brat
else:
y = rational(self.num*b.den + b.num*self.den , b.den*self.den)
y = y.lowest_terms()
return y
我们可以类似地修改__mul__
代码、__div__
代码等,但这种解决方案至少有两个问题:
int
时起作用。第一个
争论仍然必须是理性的;没有办法写出一个合理的结论
方法,允许我们在
int和be是有理数。你知道吗这种技术存在吗?(我为这个强制添加了标签,因为我认为在其他上下文中这就是所谓的强制,但我的理解是,在Python中不赞成强制。)
可以通过在类的初始值设定项中进行映射来避免重复。下面是一个处理整数的简单演示。正确处理
float
将留给读者作为练习。:)但是,我已经演示了如何轻松地实现__radd__
和__iadd__
,这是处理+=
的神奇方法(又称dunder方法)。你知道吗我的代码从代码中保留
rational
作为类名,即使Python中的类名通常是大小写。你知道吗输出
您可能希望保留
copy
方法供内部使用;通常的约定是在这些名称前面加一个下划线。你知道吗与强制使用参数不同,更通用的方法是创建自己的多方法模块,类似于几年前Guido van Rossum撰写的题为Five-minute Multimethods in Python的文章中所描述的方法。这将允许您避免大量重复的代码。下面是一个版本的增强版,它支持按相反顺序接受参数的“关联\u multimemethod”函数:
这将允许您编写如下代码:
相关问题 更多 >
编程相关推荐