2014-10-30 3 views
1

Два примера;Атрибуты класса/переменные в Python

class Foo1: 
    something = 0 
    def __init__(self, n): 
     self.something = n 

и

class Foo2: 
    def __init__(self, n): 
     self.something = n 

Оба класса, кажется, имеют такое же поведение:

x = Foo1(42) 
y = Foo2(36) 
print x.something 
# will print 42 
print y.something 
# will print 36 

Но в классе Foo1 переменная self.something (в конструкторе) фактически переменная something, как определенный в начале класса? В чем тут разница? Какой путь предпочтительнее использовать?

+0

возможно дубликат [Python: Разница между классом и экземпляром атрибутов] (http://stackoverflow.com/questions/207000/python- различия между классами и экземплярами) – sebastian

+1

Также проверьте ответы на http://stackoverflow.com/questions/2923579/python-class-attribute и http://stackoverflow.com/questions/68645/static -класс-переменные-в-питон. Каждый экземпляр Foo1 может получить доступ (и поделиться) 'something' с' x .__ class __. Something' – fredtantini

+0

Еще один: http://stackoverflow.com/q/206734/2319400 – sebastian

ответ

3

Разница заключается в том, что в первом случае вы можете получить доступ к атрибуту данных без использования объекта (или экземпляра). Во втором случае вы не можете. Пожалуйста, проверьте следующий фрагмент кода:

>>> class Foo1: 
...  something = 0 
...  def __init__(self, n): 
...   self.something = n 
... 
>>> Foo1.something 
0 
>>> class Foo2: 
...  def __init__(self, n): 
...   self.something = n 
... 
>>> Foo2.something 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: class Foo2 has no attribute 'something' 
>>> 

Надеюсь, что смогу прояснить. Для получения дополнительной информации, пожалуйста, прочтите следующее: https://docs.python.org/2/tutorial/classes.html#class-and-instance-variables

+0

Будет ли это питоном, эквивалентным статическим переменным в C? – ap0

+0

Я не думаю, что для Python требуется C статическая переменная. –

2

something это не то же самое, что и self.something. Когда вы обращаетесь к x.something или y.something, вы получаете доступ к версии, связанной с этим экземпляром. Оригинальный something является локальным для этого type, а не объект из этого типа:

>>> Foo1.something 
0 
>>> Foo1(42).something 
42 
Смежные вопросы