2011-02-01 15 views
6

Dlaczego ten kod działa dla mnie?Nie wiem jak zrobić __slots__ work

class Foo(): 
    __slots__ = [] 
    def __init__(self): 
     self.should_not_work = "or does it?" 
     print "This code does not run,",self.should_not_work 

Foo() 

Myślałem szczeliny pracował jako ograniczenie. Używam Pythona 2.6.6.

Odpowiedz

8

Mechanizm __slots__ działa dla klas w nowym stylu. Powinieneś dziedziczyć po object.

Zmień deklarację klasy do

class Foo(object): 
    # etc... 
+1

Działa świetnie! Dzięki! –

9

__slots__ zapewnia niewielką optymalizację wykorzystania pamięci, ponieważ może to zapobiec __dict__ są przydzielane do przechowywania atrybutów instancji. Może to być przydatne, jeśli masz bardzo dużą liczbę instancji.

Ograniczenie, o którym mówisz, jest głównie przypadkowym efektem ubocznym sposobu, w jaki jest wdrażane. W szczególności zatrzyma ona tworzenie tylko __dict__, jeśli twoja klasa dziedziczy z klasy bazowej, która nie ma wartości __dict__ (takiej jak object), a nawet wtedy nie będzie zatrzymywała się __dict__ przydzielana w żadnej z podklas, chyba że zdefiniuje również __slots__. Nie jest to mechanizm bezpieczeństwa, więc najlepiej nie używać go jako takiego.

Wszystkie klasy w starym stylu automatycznie otrzymują __dict__, więc __slots__ nie ma żadnego efektu. Jeśli odziedziczysz po object, uzyskasz efekt, którego szukasz, ale w zasadzie nie przejmuj się __slots__, dopóki nie będziesz wiedział, że masz miliony instancji, a pamięć to problem.

Powiązane problemy