このシナリオでは、ある種のデコレータ マジックを実行しようとするよりも、他のクラスの BaseClass または Mixin として DataLogger を使用することを好みます (デコレータを使用する Pythonic な方法としては、実際にはクリックしません)。
例えば:
class DataLogger(object):
def __init__(self):
# do init stuff
def startlog(self, t):
# start the log
class Heater(DataLogger):
def __init__(self):
# do some stuff before initing your dataLogger
super(Heater, self).__init__() # init the DataLogger
#other functions
そうすれば、次のことができます:
h1 = Heater()
h1.startlog(5)
h1.do_other_stuff()
既存のクラスのミックスインとして使用する例:
class DataLoggerMixin(object):
def __init__(self):
# do your init things
super(DataLogger, this).__init__() # this will trigger the next __init__ call in the inheritance chain (i.e. whatever you mix it with)
class Heater(object):
""" Here's a heater you have lying around that doesn't do data logging. No need to change it."""
# add a new child class with 2 lines, that includes the DataLoggerMixin as the first parent class, and you will have a new class with all the DataLogging functionality and the Heater functionality.
class LoggingHeater(DataLoggerMixin, Heater):
""" Now its a data logging heater """
pass # no further code should be necessary if you list DataLoggerMixin first in the base classes.
>>> logging_heater = LoggingHeater()
>>> logging_heater.start_log(5)
>>> logging_heater.do_heater_stuff()
Python でミックスインをうまく使用するための鍵は、メソッド解決順序 (MRO) が、特にスーパーの場合、多重継承の状況でどのように機能するかを理解することです。協調多重継承についてはこちらをご覧ください。
____________________________________________________________________
別の方法: ラッパー クラスを使用する
スキームで Mixin の方法論が機能しない場合は、ログに記録するオブジェクトのラッパー クラスとして DataLogger を使用するという別のオプションがあります。基本的に、Data Logger は、次のようにコンストラクターでログオンするオブジェクトを受け入れます。
class DataLogger(object)
def __init__(self, object_to_log)
self.object = object_to_log # now you have access to self.object in all your methods.
# Record measurements and controls in a database
def start(self,t)
# Starts a new thread to aqcuire and reccord measuements every t secconds
どのタイプのロギングまたはモニタリングが行われているか、ロギングしているオブジェクトへのアクセスが必要かどうか、またはそれが独立しているかどうかはわかりません。前者、おそらくヒーター、バルブなどはすべて、DataLogger が気にするのと同じ機能を実装しているため、クラスに関係なくログを記録できます。(これは「ダック タイピング」と呼ばれる Python のような動的言語の便利なコア機能であり、型が関心のある関数または属性を実装している限り、さまざまな型を操作できます。 ")
ラッパー クラスの方法論を使用すると、コードは次のようになります。
h1 = Heater()
log = DataLogger(h1)
log.start(60)
h1.set_power(10,100)
h1.turn_on()
sleep(10)
h1.turn_off()
お役に立てれば!