постоянство объектов в питоне - PullRequest
0 голосов
/ 21 июня 2011

До сих пор я занимался только процедурным программированием на C, поэтому мне не совсем понятно, как ООП, так и Python.

У меня большой проект, который содержит несколько файлов Python. Файл a.py определяет класс с именем fobject Я использую Python 2.5

В файлах b.py и c.py есть классы с именами BProject и CProject, которые имеют объект fobject в качестве параметра. Я включил использование импорта CProject (определенный в c.py) в b.py. У меня есть список в CProject, который я заполняю, используя графический интерфейс wx python. Затем я вызываю функцию BRun, определенную в BProject, которая внутренне вызывает функцию CRun в CProject, т.е. в год

В этом CRun я хочу манипулировать списком, но в данный момент список всегда пуст. Почему это так?

Что я должен сделать, учитывая ограничение: я не могу ничего изменить a.py, в котором определен fobject?

файл: c.py

def Instance(fObject):
    return test_page_CProject(fObject)


class CProject(object):

    def __init__(self, fObject):
        self.fObj = fObject
        self.IntList  =  []
        ##snip


    def  OnIntSelectBtnPress(self,parent):
        print ":self.IntList"
        print self.IntList
        self.listBoxIntSelect.InsertItems(self.IntList,0)
        print self.IntList


    def OnIntRun(self):

                IntLModeList = self.IntListIntMode
                #snip

файл b.py

def Instance(fObject):
    return BProject(fObject)

class BProject(object):

    def __init__(self, fObject):

        self.FObj = fObject
        #snip
        Object = __import__('CProject')
        #snip

        self.intObject = Object.Instance(self.FObj)
        self.intObject.OnIntRun()

1 Ответ

3 голосов
/ 21 июня 2011

Вы не понимаете Python. Вы должны понимать переменные (почти все в python является в основном указателем) и пространства имен .

ОК, поэтому вы не понимаете, когда python создает новые объекты.

В 90% случаев каждый раз, когда вы видите объект, он будет новым.

Например:

a = [1,2,3]
b = a + [4,5] 
print a
>>> [1,2,3]

См? b это новый объект, а нетронутый.

Также:

def func(a):
    a = [1,2,3]+a 
    return a

a = [4,5]
print func(a)
>>> [1,2,3,4,5]
print a
>>> [4,5]

Почему это произошло? Внутри функции есть совершенно новое пространство имен (которое, вероятно, похоже на новый стек). Таким образом, новый a внутри функции не имеет ничего общего со старым a вне функции.

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

Вы можете изменять вещи, но вы должны прыгать через обручи:

def func(a):
    a.append([4,5])
    return a

a = [1,2,3]
print func(a)
>>> [1,2,3,4,5]
print a
>>> [1,2,3,4,5]

Видите, это сработало! Я изменил a, потому что я использовал метод a, а не создавал новую переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...