
やりたいこと
python3で自作のクラスを作っているのですが、メソッドを連続で呼び出すということができないかと思って悩んでいます。
追記→「メソッドチェーン」です。
やりたいのは、
・データ加工1→データ加工2
を、
objX.methodA().methodB()
みたいに連続しておこなうことです。
下のコードは簡単なサンプルとして2パターン作ったものですが、両方エラーとなっています。期待するのは <p><b>text</b></p>
といった出力です。
初心者のため、そもそもクラスの理解がきちんとできていないような気がします・・・
どうすればよいのか、あるいはそもそもできないのか。
ご指導くださればありがたいです。
サンプルとエラー
【パターン1(アトリビュートを書き換える)】
python
1class HtmlTag(): 2 value="" 3 def __init__(self,text): 4 self.value = text 5 def p(self): 6 self.value = "<p>{}</p>".format(self.value) 7 def b(self): 8 self.value = "<b>{}</b>".format(self.value) 9 10H=HtmlTag("hello") 11H.b().p() 12H.value 13 14
###【パターン1:エラー】
AttributeError Traceback (most recent call last) <ipython-input-44-a148c13084d1> in <module>() 10 H=HtmlTag("hello") 11 H.p() ---> 12 H.b().p() 13 H.value AttributeError: 'NoneType' object has no attribute 'p'
###【パターン2(リターンさせる)】
python
1class HtmlTag(): 2 value="" 3 def __init__(self,text): 4 self.value = text 5 def p(self): 6 return "<p>{}</p>".format(self.value) 7 def b(self): 8 return "<b>{}</b>".format(self.value) 9 10H=HtmlTag("hello") 11H.b().p() 12
###【パターン2:エラー】
AttributeError Traceback (most recent call last) <ipython-input-1-f8bbaaa72279> in <module>() 9 10 H=HtmlTag("hello") ---> 11 H.b().p() 12 H.value AttributeError: 'str' object has no attribute 'p'
##回答をいただいて追加の疑問【追記→自分自身のアトリビュートを書き換えないで、メソッドチェーンを実現する】
たとえばstr型ですと、
test=" abc " print(test.strip().title()) #Abc print(test) # abc
という風になり、自分自身のアトリビュートを書き換えないで、
メソッドチェーンが可能になっていると思います。
これはどのようにしたら実現できるでしょうか。
自分なりに考えたところでは、
class HtmlTag(): def __init__(self,text): self._value = text self._temp= text def p(self): self._temp = "<p>{}</p>".format(self._temp) return self def b(self): self._temp = "<b>{}</b>".format(self._temp) return self def __str__(self): return self._value H=HtmlTag("hello") print(H.b().p()._temp) #<p><b>hello</b></p> print(H._value) #hello
という具合にできないわけではないのですが、
前記のstr型の例だと、_tempみたいな変な指定はありません。
この点もう少しスマートなやり方があるような気がして、よければお教えください。





回答4件
あなたの回答
tips
プレビュー