2016-09-23 4 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): 
    --------- 

Как я могу сосчитать, сколько раз я доступ к self.b переменного на вызов meth2() или любой метод класса А. Есть ли способ, я могу войти использование self.b переменного?

ответ

1

Если вы не хотите, чтобы свойство, вы можете войти на чтение/записи с помощью __getattribute__ (не __getattr__ так b существует и не будет называться) и __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

Вы можете использовать свойство, 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 
    ... 
    ... 
Смежные вопросы