Найти - Пользователи
Полная версия: Область видимости переменных объектов
Начало » Python для новичков » Область видимости переменных объектов
1
forregg
Подскажите пожалуйста,
создаю несколько объектов класса 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):
...

Soteric
Что конкретно смущает?
forregg
Soteric
происходит “дозапись” в списки closedPositions.. (см код ниже) и в конце цикла в этих списках все записи всех объектов.
“происходит “дозапись” в списки closedPositions.. (см код ниже) и в конце цикла в этих списках все записи всех объектов.” т.е. нескольких созданных объектов пишут в одни и те же переменные, хотя это обычные переменные класса (объекты которого создаются), глобально нигде не объявленные.
Soteric
Это нормально. Когда мы перезаписываем в переменную ссылку на другой объект, с исходным объектом ничего не случается. Он продолжает жить, просто эта переменная больше не указывает на него.
forregg
Soteric
Это нормально. Когда мы перезаписываем в переменную ссылку на другой объект, с исходным объектом ничего не случается. Он продолжает жить, просто эта переменная больше не указывает на него.
Тогда почему получается что у нескольких объектов общая переменная - список, в который они дописывают данные?
Soteric
А.. кажется я понял вопрос :)
class Tester():
positions = []
closedPositions = []
Видимо потому, что эти переменные объявлены на уровне класса и являются общими для всех экземпляров этого класса.
class Tester():
def __init__(self):
self.positions = []
self.closedPositions = []
Чтобы они были разными для экземпляров нужно писать так.
forregg
Soteric
А.. кажется я понял вопрос
Большое спасибо
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB