当作为参数传递时,如何控制对象如何被其他函数“看到”?

时间:2013-01-12 22:19:05

标签: python

例如,假设我有一个像这样的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对象传递给上面的一般函数,而不需要知道对象类型的函数?所以它“看到”的是构成对象属性的坐标?

希望这是有道理的!

3 个答案:

答案 0 :(得分:1)

您需要实施相应的special methods;在您的情况下,您希望实现__getitem__()以支持索引。

答案 1 :(得分:1)

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

在第二个示例中,您可以实现__getitem__ hook以使其行为类似于序列:

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__

答案 2 :(得分: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