0

例如,假设我有一个像这样的 Vector 类:

class Vector(object):
    def __init__(self, x=0.0, y=0.0):
        self.x = x
        self.y = y

    def __str__(self):
        return '(%s, %s)' % (self.x, self.y)

如果我将此对象作为参数传递给函数,则函数将其视为

<__main__.Vector object at 0x02297E50>

现在,我可以让函数提前知道Vector(可以这么说),以便它知道访问它的属性

def foo(vect1, vect2):
    return (vect2.x - vect1.x, vect2.y - vect1.y)

但是如果我想要一个只接受一对坐标的通用函数呢?

def foo(p1, p2):
    return (p2[0] - p1[0], p2[1] -p1[1])

有没有办法让一个对象以特定的方式表示自己?例如,这样我就可以将我的 Vector 对象传递给上述通用函数,而所述函数不需要知道对象类型?那么它“看到”的只是构成对象属性的坐标吗?

希望这是有道理的!

4

3 回答 3

1

您需要实现适当的特殊方法;在您的情况下,您想要实施__getitem__()以支持索引。

于 2013-01-12T22:20:55.743 回答
1

您必须调整对象以实现某些python 钩子以“通用”方式运行。

在您的第二个示例中,您可以实现__getitem__挂钩以使其表现得像一个序列:

class Vector(object):
    # rest of the class

    def __getitem__(self, index):
        return (self.x, self.y)[index]

或者做一个小示范:

>>> v = Vector(10, 20)
>>> v
<__main__.Vector object at 0x10866ad90>
>>> str(v)
'(10, 20)'
>>> v.x
10
>>> v[0]
10

你已经__str__为自己发现了。

于 2013-01-12T22:22:28.983 回答
0

在这种情况下,您可能需要考虑namedtuple

>>> from collections import namedtuple
>>> Vector = namedtuple("Vector", "x y")
>>> v = Vector(1, 2)
>>> print v
Vector(x=1, y=2)
>>> assert v[0] == v.x
于 2013-01-12T23:24:12.077 回答