Переменные класса Python или переменные класса в целом

1

От погружения в Python:

Атрибуты класса доступны как по прямой ссылке на класса и через любой экземпляр класса.

Атрибуты класса могут использоваться как константы уровня класса, но они не совсем постоянные. Вы также можете изменить их.

Поэтому я ввожу это в IDLE:

IDLE 2.6.5      
>>> class c:
        counter=0


>>> c
<class __main__.c at 0xb64cb1dc>
>>> v=c()
>>> v.__class__
<class __main__.c at 0xb64cb1dc>
>>> v.counter += 1
>>> v.counter
1
>>> c.counter
0
>>> 

Так что я делаю неправильно? Почему переменная класса не поддерживает ее значение как через прямую ссылку на класс, так и через любой экземпляр класса.

  • 0
    Поскольку c.counter по-прежнему равен 0, вы, очевидно, не изменили его значение. Как бы вы ни изменили значение атрибута counter экземпляра v.
  • 0
    Вы ищете "статические переменные класса", я думаю. Возможно, дубликат stackoverflow.com/questions/68645/…
Теги:
oop

4 ответа

8
Лучший ответ

Поскольку ints неизменяемы в python

v.counter += 1

переупорядочивает v.counter к новому объекту int. Переупорядочение создает атрибут экземпляра, который маскирует атрибут класса

Это можно увидеть, если вы посмотрите на id() of v.counter

>>> id(v.counter)
149265780
>>> v.counter+=1
>>> id(v.counter)
149265768

Здесь вы можете видеть, что v теперь имеет новый атрибут в своем __dict__

>>> v=c()
>>> v.__dict__
{}
>>> v.counter+=1
>>> v.__dict__
{'counter': 1}

Контрастируйте случай, когда counter является изменяемым, например, list

>>> class c:
...  counter=[]
... 
>>> v=c()
>>> v.counter+=[1]
>>> c.counter
[1]
>>> 
  • 0
    Я бы v.counter : новый объект int ... v.counter
  • 0
    офигенно, спасибо!
0

До:

c.counter = 0
v.counter -> c.counter

Во:

c.counter = 0
v.counter = c.counter + 1

После:

c.counter = 0
v.counter = 1
0

Обратите внимание, что вы все равно можете получить значение класса:

v.__class__.__dict__['counter'] 

позволит вам читать или устанавливать в свой класс, даже если вы затеняли символ, добавив символ в свой экземпляр __dict __.

0

Вы путаетесь между объявлением и .

C - это имя объявленного вами класса.

v - объект, созданный из c.

  • 0
    Это не путаница здесь. Если вы установите переменную для класса, вы можете прочитать ее точно так же, как описано выше: instance.classvariable.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню