2011-07-15 8 views
1

私はこのような何かやりたい:python:クラスのゲッターメソッドで文字列フォーマット演算子を使用できますか?

class Foo(object): 
    def __init__(self, name): 
     self._name = name 
     self._count = 0 
    def getName(self): 
     return self._name 
    name = property(getName) 
    def getCount(self): 
     c = self._count 
     self._count += 1 
     return c 
    count = property(getCount) 
    def __repr__(self): 
     return "Foo %(name)s count=%(count)d" % self.__dict__ 

が、namecountはゲッターとプロパティであるので、それが動作しませんが。

これを修正する方法はありますか?名前付き引数を持つ書式文字列を使用してゲッターを呼び出せますか?

答えて

2

self.__dict__を使用しないように変更してください。使用中のその後

class Foo(object): 
    def __init__(self, name): 
     self._name = name 
     self._count = 0 
    def getName(self): 
     return self._name 
    name = property(getName) 
    def getCount(self): 
     c = self._count 
     self._count += 1 
     return c 
    count = property(getCount) 
    def __repr__(self): 
     return "Foo %s count=%d" % (self.name, self.count) 

:あなたは代わりにそのプロパティがバインドされている名前でそれらにアクセスしようとしているのプロパティとしてnamecountにアクセスする必要が

>>> f = Foo("name") 
>>> repr(f) 
'Foo name count=0' 
>>> repr(f) 
'Foo name count=1' 
>>> repr(f) 
'Foo name count=2' 

EDIT:あなたはまだすることができを名前付き書式を使用しますが、目的の名前でプロパティにアクセスできないため、アプローチを変更する必要があります。

def __repr__(self): 
    return "Foo %(name)s count=%(count)d" % {'name': self.name, 'count': self.count} 

あなたが物事を繰り返したり、たくさんのことをしたりするのが良いかもしれませんが、少しばかげています。

+0

私はそれを行うことができますが、私はむしろフォーマットされた文字列で名前付き引数を使用したいと思います。私は2つではなく6つまたは7つのフィールドがあるケースがあり、リストとフォーマット文字列を同期させておくのは混乱します。 –

+0

@ Jasonええ、残念ながら、これを行うには素晴らしい方法はありません。あなたが 'name'と' count'という名前でそれらにアクセスするには、プロパティにアクセスする必要があります。私はあなたがまだ名前の書式設定を使用することができるばかげた方法を追加しましたが、それはあなたのニーズに適しているかもしれませんが、そうではないかもしれません。 –

+0

+1:それは幾分かっこいいです(あなたが言っているように "ばかげた"ですが、非常に簡単です)。ありがとう! –

関連する問題