2016-09-23 59 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的調用或A類的任何方法self.b變量有什麼辦法,我可以登錄self.b變量的使用情況如何?

回答

1

如果你不想做一個屬性,您可以登錄讀/ write access using __getattribute__(not __getattr__ since b exists and would be called)and __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 _B

0

您可以使用屬性,就像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 
    ... 
    ...