почему переменная члена ассоциативной карты python является общей для объектов - PullRequest
1 голос
/ 20 февраля 2010

Для класса A, почему переменная-член aMap является общей для объекта и объекта b?

>>> class A:
...     aMap = {}

>>> a = A()
>>> a.aMap["hello"] = 1

>>> b = A()
>>> b.aMap["world"] = 2

>>> c = []
>>> c.append(a)
>>> c.append(b)

>>> for i in c:
...     for j in i.aMap.items():
...         print j
('world', 2)  
('hello', 1)  
('world', 2)  
('hello', 1)  

Ответы [ 3 ]

5 голосов
/ 20 февраля 2010

Поскольку вы определили его как атрибут класса, а не атрибут экземпляра.

Если вы хотите иметь его в качестве атрибута экземпляра и не делиться между экземплярами, вы должны определить его следующим образом:

class A(object):
    def __init__(self):
        self.aMap = {}
3 голосов
/ 20 февраля 2010

Поскольку это атрибут класса, а не атрибут экземпляра («переменная-член»).

Чтобы сделать его атрибутом экземпляра, назначьте его экземпляру, например в конструкторе:

class A:
    def __init__(self):
        self.aMap = {}

Но вы также можете сделать:

a = A()
a.aMap = {}
0 голосов
/ 20 февраля 2010

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

Чтобы определить переменную экземпляра, вы должны сделать это с помощью метода, ссылающегося насам объект (обычно self):

class A(object):
    class_variable = 0

    def __init__(self, a, b):
        self.instance_variable = a
        class_variable = b

>>> a=A(1,2)
>>> print a.instance_variable
1
>>> print a.class_variable
2
>>> b=A(2,1)
>>> print b.instance_variable
2
>>> print b.class_variable
1
>>> print a.instance_variable
1
>>> print a.class_variable
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...