2016-09-23 12 views
1

私は以下のようなPythonクラスを持っています。Python:インスタンス変数のアクセスを数える方法

class A(object): 
    def __init__(self, logger): 
     self.b = B() 
     self.logger = logger 
    def meth1(self): 
     self.b.mymethod1() 
    def meth2(self): 
     self.meth1() 
     self.b.mymethod2() 
    ......... 
class B(object): 
    --------- 

は、どのように私はmeth2の呼び出し(上self.b変数にアクセスしたどのように多くの時間を数えることができる)、またはクラスAのいずれかの方法は、私がself.b変数の使用状況をログに記録することができます方法はありますか?

答えて

1

__getattribute__bが存在し、呼び出されないためではない__getattr__)と__setattr__を使用して/書き込みアクセス:

class A(object): 
    def __init__(self): 
     # initialize counters first ! 
     self.b_read_counter = 0 
     self.b_write_counter = 0 
     # initialize b 
     self.b = 12 

    def __getattribute__(self,attrib): 
     # log read usage 
     if attrib=="b": 
      self.b_read_counter+=1 
     # now return b value 
     return object.__getattribute__(self, attrib) 

    def __setattr__(self,attrib,value): 
     if attrib=="b": 
      self.b_write_counter+=1 

     return object.__setattr__(self, attrib,value) 

a = A() 

a.b = 23 # second write access (first is in the init method) 
if a.b == 34: # first read access 
    print("OK") 
if a.b == 34: 
    print("OK") 
if a.b == 34: # third read access 
    print("OK") 
print(a.b_read_counter) 
print(a.b_write_counter) 

結果:

3 
2 
+0

ありがとう..これは私が探しているものです。 – lima

1

これにはdescriptorsを使用するか、基本的には記述子であるプロパティを作成することができます。

class A(object): 
    def __init__(self, logger): 
     self._b = B() 
     self._b_counter = 0 
     self.logger = logger 

    @property 
    def b(self): 
     self._b_counter += 1 
     return self._b 

    def meth1(self): 
     self.b.mymethod1() 

    def meth2(self): 
     self.meth1() 
     self.b.mymethod2() 
+0

プロパティを使用するには良いアイデアです、それはインスタンス変数とインスタンスメソッドの両方を扱うことができるので、まだ私は、のgetAttribute答えて行きます。ありがとう。 – lima

2

'b'をプロパティに設定し、セッターに対応するカウンタを増やします。

@property 
def b(self): 
    self.b_counter += 1 
    return self._b 

とあなたのクラスで_b

0

とBを交換するあなたのようなsomtehing、プロパティを使用することができます:あなたはプロパティを作成したくない場合は、読み取りを記録することができます

class A(object): 
    def __init__(self, logger): 
     self._b = B() 
     self._count = 0 
     self.logger = logger 

    @property 
    def b(self): 
    self._count += 1 
    return self._b 
    ... 
    ... 
関連する問題