【发布时间】:2013-02-21 17:40:25
【问题描述】:
作为一个人为的例子,假设我在 python 中生成一个随机的水果篮。我创建了篮子:
basket = FruitBasket()
现在我想指定篮子中可能出现的特定水果组合。假设我是一个非常挑剔的家伙,篮子要么必须装满苹果和石榴、橙子和葡萄柚,要么只有香蕉。
我正在阅读有关 python 运算符重载的内容,似乎我可以定义 __or__ 和 __and__ 来获得我想要的行为。我想我可以这样做:
basket.fruits = (Apple() & Pomegranate()) | (Banana()) | (Orange() & Grapefruit())
创建两个类(Or 和And)就可以了。当__or__ 或__and__ 被调用时,我只需返回一个新的Or 或And 对象:
def __or__(self, other):
return Or(self, other)
def __and__(self, other):
return And(self, other)
我想弄清楚的是如何在不必先实例化水果的情况下做到这一点?为什么我不能在基础 Fruit 类上使用静态 __or__ 方法?我已经尝试过了,但它不起作用:
class Fruit(object):
@classmethod
def __or__(self, other):
return Or(self, other)
并分配水果:
basket.fruits = (Apple & Pomegranate) | (Orange & Grapefruit) | (Banana)
我收到这样的错误:
TypeError: unsupported operand type(s) for |: 'type' and 'type'
对如何进行这项工作有任何想法吗?
【问题讨论】:
标签: python operator-overloading