2011-11-13 23 views
13

Powiel możliwe:
Static class variables in Python
What is the Python equivalent of static variables inside a function?Statyczny element funkcji w języku Python?

Jak mogę używać pól statycznych w Pythonie?

Na przykład chcę policzyć, ile razy funkcja została wywołana - jak mogę to zrobić?

+0

zgadzam się: duplikat – gecco

+0

@PaulManta: I d isagree. Twój link nie jest powiązany z polami statycznymi klasy (jak mówi OP), ale "członem statycznym na poziomie funkcji, w przeciwieństwie do poziomu klasy_", jak podaje OP w ramach pytania, któremu dałeś użyć łącza. – Tadeck

+2

@Tadeck Słowo "klasa" nawet nie pojawia się w pytaniu ...Ale fraza "statyczny element ** funkcji **" ma. –

Odpowiedz

4

Jeśli chcesz policzyć ile razy metoda została wywołana, bez względu na wystąpienie nazwał go, można użyć elementu klasy tak:

class Foo(object): 
    calls=0   # <--- call is a class member 
    def baz(self): 
     Foo.calls+=1 

foo=Foo() 
bar=Foo() 
for i in range(100): 
    foo.baz() 
    bar.baz() 
print('Foo.baz was called {n} times'.format(n=foo.calls)) 
# Foo.baz was called 200 times 

Podczas definiowania calls ten sposób :

class Foo(object): 
    calls=0    

Python umieszcza parę klucz-wartość ('połączenia', 0) w Foo.__dict__.

Może to być z dostępem z Foo.calls. Wystąpienia Foo, takie jak foo=Foo(), mogą również uzyskać do niego dostęp za pomocą foo.calls.

Aby przypisać nowe wartości do Foo.calls należy użyć Foo.calls = .... Instancje nie mogą używać foo.calls = ..., ponieważ powoduje to, że Python umieszcza nową i inną parę klucz-wartość w foo.__dict__, gdzie przechowywane są elementy instancji.

3

Oto przykład zliczanie liczby połączeń wszystkich obiektów tej samej klasy:

class Swallow(): 
    i = 0 # will be used for counting calls of fly() 
    def fly(self): 
     Swallow.i += 1 

I to jest dowód:

>>> a = Swallow() 
>>> b = Swallow() 
>>> a.fly() 
>>> a.i 
1 
>>> Swallow.i 
1 
>>> b.fly() 
>>> b.i 
2 
>>> Swallow.i 
2 

więc można ją przeczytać, dając obiektu imię i nazwisko lub nazwę klasy.

3

Oto dekorator dodający liczenie do funkcji.

import functools 

def count_calls(func): 
    @functools.wraps(func) 
    def decor(*args, **kwargs): 
     decor.count += 1 
     return func(*args, **kwargs) 
    decor.count = 0 
    return decor 

Zastosowanie:

>>> @count_calls 
... def foo(): 
...  pass 
... 
>>> foo.count 
0 
>>> foo() 
>>> foo.count 
1 
+0

Dekorator może być lepiej nazwany 'count_calls' – jfs

+0

zgodził się, zmieniłem to – yak

+0

To dość najbardziej skomplikowany sposób robienia tego, prawda? – Patryk

1

Oto jeden uproszczony sposób, aby to zrobić:

def func(): 
    if not hasattr(func, 'counter'): 
     func.counter = 0 
    func.counter += 1 
    counter = 0 # Not the same as `func.counter` 
    print(func.counter) 

Lub jeśli nie lubią, jeśli są wykonywane na każde wezwanie, można to zrobić:

def func(): 
    func.counter += 1 
    print(func.counter) 
func.counter = 0 
Powiązane problemy