2016-09-23 25 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 
    ... 
    ...