2016-09-23 10 views
1

Ich habe eine Python-Klasse wie folgt.Python: Wie man den Zugriff einer Instanzvariable zählt

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): 
    --------- 

Wie kann ich zählen, wie viele Zeit, die ich self.b Variable auf den Aufruf von meth2() oder jede Methode der Klasse A. Gibt es eine Möglichkeit zugegriffen wird, kann ich die Verwendung von self.b Variable log?

Antwort

1

Wenn Sie nicht eine Eigenschaft machen möchten, können Sie die Lese anmelden können/Schreibzugriff mit __getattribute__ (nicht __getattr__ seit b existiert und nicht aufgerufen werden würde) und __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) 

Ergebnis:

3 
2 
+0

Danke .. das ist genau was ich suche. – lima

1

Sie können dafür descriptors verwenden oder einfach eine Eigenschaft erstellen, die im Grunde genommen ein Deskriptor ist.

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

Eigenschaft ist eine gute Idee, noch werde ich mit getAttribute Antwort gehen, da es sowohl die Instanzvariablen und Instanzmethode verarbeiten kann. Vielen Dank. – lima

2

make 'b' eine Eigenschaft und und erhöhen Sie den Zähler entsprechend im Setter sein.

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

und in Ihrer Klasse ersetzen b mit _b

0

Sie Eigentum verwenden können, somtehing wie:

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 
    ... 
    ... 
Verwandte Themen