2012-05-01 3 views
1

Можно создать дубликат:
Instance variables vs. class variables in PythonPython ... Статические переменные?

В чем разница между этими двумя ситуациями, и как это лечится с в Python?

Ех1

class MyClass: 
    anArray = {} 

Ex2

class MyClass: 
    __init__(self): 
      self.anArray = {} 

Похоже, что и в первом примере массив обрабатывается как статической переменной. Как Python относится к этому и в чем причина этого?

+0

Это не «статическая переменная», но она является членом * конкретного объекта *, который имеет «стабильное имя». Какой объект может быть? ;-) (Помните, что классы не являются «просто определениями» в Python.) –

+0

Они называются переменными класса. http://stackoverflow.com/questions/2714573/instance-variables-vs-class-variables-in-python или http://stackoverflow.com/questions/68645/static-class-variables-in-python – birryree

ответ

5

В первом примере anArray (который в Python называется словарем, а не массивом) является атрибутом класса. Доступ к нему можно получить с помощью MyClass.anArray. Он существует, как только класс определен.

Во втором примере anArray является атрибутом экземпляра. Доступ к нему можно получить, используя MyClass().anArray. (Но учтите, что это просто отбрасывает созданный экземпляр MyClass, более разумным примером является mc = MyClass(); mc.anArray['a'] = 5.) Он не существует, пока не будет создан экземпляр класса.

0

Это заявленная область. Ex1 как глобальная или статическая переменная.

obj = MyClass() 
obj2 = MyClass() 
print "IS one instance ", id(obj.anArray) == id(obj2.anArray) 

Ex2 - местный атрибут.

obj = MyClass() 
obj2 = MyClass() 
print "IS one instance ", id(obj.anArray) == id(obj2.anArray) 
+1

Я думаю атрибут класса и атрибут экземпляра являются более подходящими условиями. – jdi

+0

Я не уверен, что вы пытаетесь показать с помощью этих битов кода, поскольку они точно идентичны. – Joost

Смежные вопросы