Загадочное поведение - PullRequest
       22

Загадочное поведение

3 голосов
/ 22 февраля 2012

Не могу понять, что здесь происходит:

class testclass: 

    def __init__(self): 
        print "new instance" 
    myList=[] 

if __name__ == "__main__":  

    inst1=testclass() 
    inst1.myList.append("wrong") 

    inst2=testclass() 
    inst2.myList.append("behaviour") 

    print "I get the",inst2.myList

Вывод:

new instance
new instance
I get the ['wrong', 'behaviour']

Я бы ожидал, что список в inst1 ничего не знает о списке в inst2 , но как-то похоже, что область действия myList выходит за пределы экземпляра класса.Я нахожу это очень тревожным и загадочным, или я что-то здесь упускаю?

Спасибо!

Ответы [ 6 ]

6 голосов
/ 22 февраля 2012

То, как вы определили myList, является атрибутом класса.

Поведение, которое вы ищете, относится к атрибуту объекта:

class testclass:
    def __init__(self): 
        print "new instance"
        self.myList = []

Давайте попробуем:

>>> t1 = testclass()
new instance
>>> t2 = testclass()
new instance
>>> t1.myList.append(1)
>>> t2.myList.append(2)
>>> t1.myList
[1]
>>> t2.myList
[2]

Если вас интересуют атрибуты класса, взгляните на документацию Class . Поскольку классы в Python также являются объектами, как (почти) все в Python, они могут иметь свои собственные атрибуты.

3 голосов
/ 22 февраля 2012

То, как вы объявили myList внутри класса, делает его атрибутом class . если вы намеревались иметь атрибут instance , объявите его следующим образом, и он будет иметь ожидаемое поведение:

class testclass:
    def __init__(self): 
        print "new instance" 
        self.myList=[]
1 голос
/ 22 февраля 2012

myList инициализируется в классе времени создания экземпляра, поскольку оно объявлено в теле класса, а не в объекте времени создания.

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

Итак, в вашем случае вы используете каждый объект для доступа к одному и тому же объекту myList (и добавляете значение кэто).

1 голос
/ 22 февраля 2012

Да, потому что это то, для чего предназначены атрибуты класса.Если вам нужна переменная экземпляра, вам нужно объявить ее в самом экземпляре - обычно с self внутри метода.

0 голосов
/ 22 февраля 2012

Если вы хотите, чтобы myList был переменной экземпляра, вы должны определить self.myList внутри функции init. Тогда вы должны получить поведение, которое вы ожидаете. Как вы понимаете, myList является переменной класса и будет использоваться всеми экземплярами класса.

0 голосов
/ 22 февраля 2012
class testclass:

    def __init__(self):
        self.myList=[]
        print "new instance"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...