2015-10-02 16 views
9

私のクラスの文字列表現を手動で実装するのに疲れているので、私はそれを自動的に行うためのpyononicな方法があるのだろうかと思っていました。Pythonで__str __()を自動生成する方法はありますか?

私はクラスのすべての属性とクラス名をカバーする出力を得たいと思います。次に例を示します。中に結果の

class Foo(object): 
    attribute_1 = None 
    attribute_2 = None 
    def __init__(self, value_1, value_2): 
     self.attribute_1 = value_1 
     self.attribute_2 = value_2 

bar = Foo("baz", "ping") 
print(str(bar)) # desired: Foo(attribute_1=baz, attribute_2=ping) 

この質問は、いくつかのJavaプロジェクトでプロジェクトロンボク@ToStringを使用した後に頭に浮かびました。

+0

? –

+0

ボイラープレートのコードを減らしました。機能についてはこちらをご覧ください:https://projectlombok.org/features/index.html –

+1

実際、「定型的なコードの削減」は何も意味しません。ロンボクは特定のJavaの問題を扱います。 「類似の」ツールを検索するのは無駄です。もっと具体的なものを求めるのが良いでしょう。 –

答えて

16

あなたはinstnaceはvarsdirを、使用して属性を反復することができます...:

>>> def auto_str(cls): 
...  def __str__(self): 
...   return '%s(%s)' % (
...    type(self).__name__, 
...    ', '.join('%s=%s' % item for item in vars(self).items()) 
...  ) 
...  cls.__str__ = __str__ 
...  return cls 
... 
>>> @auto_str 
... class Foo(object): 
...  def __init__(self, value_1, value_2): 
...   self.attribute_1 = value_1 
...   self.attribute_2 = value_2 
... 
>>> str(Foo('bar', 'ping')) 
'Foo(attribute_2=ping, attribute_1=bar)' 
1

が、この中にはanswerred falsetru書きました。 その同じアイデアは、鉱山は彼が非常に良くは私見に実装され、それを読んという点で非常に初心者に優しいです

プロジェクトロンボクは、Javaのために何
class stringMe(object): 
     def __str__(self): 
      attributes = dir(self) 
      res = self.__class__.__name__ + "(" 
      first = True 
      for attr in attributes: 
       if attr.startswith("__") and attr.endswith("__"): 
        continue 

       if(first): 
        first = False 
       else: 
        res += ", " 

       res += attr + " = " + str(getattr(self, attr)) 

      res += ")" 
      return res 

    class Foo(stringMe): 
     attribute_1 = None 
     attribute_2 = None 
     def __init__(self, value_1, value_2): 
      self.attribute_1 = value_1 
      self.attribute_2 = value_2 


bar = Foo("baz", "ping") 
print(str(bar)) # desired: Foo(attribute_1=baz, attribute_2=ping) 
関連する問題