2011-10-18 12 views

Odpowiedz

49

Jeśli chcesz atrybut być wspólne dla wszystkich instancji klasy, należy użyć atrybutu class:

class A(object): 
    foo = None 

Powoduje ('foo',None) być parą (key,value) w A.__dict__.

Jeśli chcesz atrybut będzie można dostosować na podstawie na przykład, można użyć atrybutu przykład:

class A(object): 
    def __init__(self): 
     self.foo = None 

Powoduje ('foo',None) być (key,value) para w a.__dict__ gdzie a=A() jest instancją A.

+1

ma sens, myślałem, że są one ograniczone do wystąpienia w obu przypadkach ... dzięki :) – fortran

+6

Python ma skomplikowany zestaw [reguł wyszukiwania atrybutów] (http://www.cafepy.com/article/python_attributes_and_methods/ python_attributes_and_methods.html). Bez wchodzenia w deskryptory, w tym przypadku wystarczy wiedzieć, że 'a .__ dict__' jest najpierw wyszukiwany jako klucz' foo', a jeśli go tam nie ma, to przeszukiwany jest 'A .__ dict__'. Dlatego możesz użyć 'a.foo', nawet jeśli' foo' jest atrybutem klasy. – unutbu

+1

Warto również zauważyć, że jeśli chodzi o atrybuty klas, jeśli robisz "a.foo = cokolwiek", to w efekcie powstanie nowy atrybut instancji (który ukrywa atrybut klasy). 'A.foo' pozostanie niezmienione. To trochę kłopotliwe, ponieważ możesz uzyskać dostęp do wartości 'A.foo' za pomocą' a.foo', ale przypisanie do niej spowoduje utworzenie nowego atrybutu instancji. – Kat

2

Atrybuty zdefiniowane w definicji klasy są uważane za zmienne klasy (jak zmiennych statycznych w Javie), natomiast w samym inicjator są atrybuty instancji (zwrócić uwagę na różnicę pomiędzy self.something = 1 i something = 1). Zobacz this question, aby uzyskać więcej informacji, i this one, aby uzyskać jeszcze więcej. Nie ma dużej różnicy między tymi dwoma przypadkami, ponieważ definicja na poziomie klasy nadaje atrybutowi wartość domyślną, ale jeśli chcesz użyć jakiejś logiki do ustawienia atrybutu przed użyciem instancji obiektu, powinieneś zrobić to w metoda __init__().

Powiązane problemy