Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 30, 2012 09:17:24

forregg
Зарегистрирован: 2012-10-03
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Область видимости переменных объектов

Подскажите пожалуйста,
создаю несколько объектов класса Tester, которые принимают в качестве параметра класс, который они создают и с ним работают. Если они создаются в цикле, то происходит “дозапись” в списки closedPositions.. (см код ниже) и в конце цикла в этих списках все записи всех объектов. Что будет при создании экземпляров класса в разных потоках, даже боюсь представить.

Я совсем новичок в python, по опыту других языков - каждый объект - отдельная сущность, переменные которой никак не могут пересекаться с одноименными переменными других объектов. Подскажите пожалуйста, где ошибаюсь. Спасибо.

модуль main
...
for exitMinute in range(55, 60, 1):
    strategyParams = {'pOptimization': True,'pExitMinute': exitMinute}
    tester = Tester(data, t, strategyParams)
    tester.start()
...
модуль tester
...
class Tester():
    positions = []
    closedPositions = []
    orders = []
    def __init__(self, data, strategyClass, strategyParams = None):
        self.strategy = strategyClass(self, strategyParams)
...
    def closePosition(self, position, bar = None, price = 0,  market = False):
...
        self.positions.remove(position)
        self.closedPositions.append(position)
...
модуль t (наследование от strategy)
...
class t(Strategy):
    def __init__(self, engine, params):
...

Отредактировано FishHook (Ноя. 30, 2012 12:51:53)

Офлайн

#2 Ноя. 30, 2012 09:27:25

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Область видимости переменных объектов

Что конкретно смущает?



Офлайн

#3 Ноя. 30, 2012 11:47:45

forregg
Зарегистрирован: 2012-10-03
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Область видимости переменных объектов

Soteric
происходит “дозапись” в списки closedPositions.. (см код ниже) и в конце цикла в этих списках все записи всех объектов.
“происходит “дозапись” в списки closedPositions.. (см код ниже) и в конце цикла в этих списках все записи всех объектов.” т.е. нескольких созданных объектов пишут в одни и те же переменные, хотя это обычные переменные класса (объекты которого создаются), глобально нигде не объявленные.

Отредактировано forregg (Ноя. 30, 2012 11:48:56)

Офлайн

#4 Ноя. 30, 2012 11:55:50

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Область видимости переменных объектов

Это нормально. Когда мы перезаписываем в переменную ссылку на другой объект, с исходным объектом ничего не случается. Он продолжает жить, просто эта переменная больше не указывает на него.



Офлайн

#5 Ноя. 30, 2012 16:58:45

forregg
Зарегистрирован: 2012-10-03
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Область видимости переменных объектов

Soteric
Это нормально. Когда мы перезаписываем в переменную ссылку на другой объект, с исходным объектом ничего не случается. Он продолжает жить, просто эта переменная больше не указывает на него.
Тогда почему получается что у нескольких объектов общая переменная - список, в который они дописывают данные?

Офлайн

#6 Ноя. 30, 2012 17:14:49

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Область видимости переменных объектов

А.. кажется я понял вопрос :)

class Tester():
positions = []
closedPositions = []
Видимо потому, что эти переменные объявлены на уровне класса и являются общими для всех экземпляров этого класса.
class Tester():
def __init__(self):
self.positions = []
self.closedPositions = []
Чтобы они были разными для экземпляров нужно писать так.



Отредактировано Soteric (Ноя. 30, 2012 17:15:24)

Офлайн

#7 Ноя. 30, 2012 17:29:28

forregg
Зарегистрирован: 2012-10-03
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Область видимости переменных объектов

Soteric
А.. кажется я понял вопрос
Большое спасибо

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version