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