クラスのいくつかのメソッドに対して同じ編集を行う簡単な方法があるかどうかを知りたいと思います。例:クラスのいくつかのメソッドをループで上書きする
class Dog():
def __init__(self):
self.name = 'abc'
self.age = 1
def setName(self, newValue):
self.name = newValue
def setAge(self, newValue):
self.age = newValue
class TalkingDog(Dog):
def __init__(self):
super().__init__()
# The end is in pseudo code :
for method in TalkingDog.allMethods :
method = method + 'print('I have been edited !')'
だから私はこれを試してみました
...私はまた、各メソッドを上書きすることができることを知っているが、メソッドの数十の状況では、それは少し退屈になります。
class TalkingDog(Dog):
def __init__(self):
super().__init__()
for method in self.__dir__():
if method.startswith('set'):
oldMethod = getattr(self, method)
def _newMethod(newValue):
oldMethod(newValue)
print('I have been edited !')
setattr(self, method, _newMethod)
a = TalkingDog()
print(a.setName) >>> <function TalkingDog.__init__.<locals>._newMethod at 0x0000000002C350D0>
これはほとんど動作しますが、setNameはもうメソッドではありません。関数を含む属性です。なぜ私は完全に理解しますが、私はよりクリーンな結果を得ようとしています。その結果、後で問題が発生する危険性があります。たとえば、ライブラリピックルをそのオブジェクトに使用することはできません(エラーは_pickle.PicklingError: Can't pickle <function TalkingDog.__init__.<locals>._newMethod at 0x00000000003DCBF8>: attribute lookup _newMethod on __main__ failed
です)。
'set'や' get'メソッドではなく、プロパティを使う:http://stackoverflow.com/q/1554546/3001761 – jonrsharpe
また、実際のユースケースは?あなたは本当に話す犬を作っていますか?もしそうなら、犬は年齢が変わるたびに話すべきではありません。犬に話をしたい場合は、年齢を変えることとは別に話す。 –
@jonrsharpe私はなぜ、どのようにプロパティを使用してその場合に役立つか分かりません。 – Morgan