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__2 番目の例では、フックを実装してシーケンスのように動作させることができます。

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 に答える