Доброе утро,
У меня возникла проблема при попытке использовать ___ слотов __ в одном из моих занятий. Я хочу использовать его для оптимизации создания нескольких экземпляров объекта Classifier. Я использую Python 3.7.1.
Это работает
class Classifier() :
def __init__(self, own_storage, partner_storage, decision, strength) :
self.own_storage = own_storage
self.partner_storage = partner_storage
self.decision = decision
self.strength = strength
Это не работает
class Classifier() :
__slots__ = ('own_storage', 'partner_storage', 'decision', 'strength')
def __init__(self, own_storage, partner_storage, decision, strength) :
self.own_storage = own_storage
self.partner_storage = partner_storage
self.decision = decision
self.strength = strength
Здесь я создаю все экземпляры классификатора (это метод другого класса)
def allClassifiers(self) :
cs = []
own_range = []
partner_range = []
for i in range(1, self.agent.model.n_types + 1) :
own_range.append(i)
own_range.append(-i)
partner_range.append(i)
partner_range.append(-i)
for own in own_range :
for partner in partner_range :
for decision in [0, 1] :
cs.append(Classifier(own, partner, decision, i))
return cs
Ошибка, которую я получаю:
Traceback (most recent call last):
File "C:\Users\Diru\Desktop\Internship\Sketch\classes\test.py", line 53, in <module>
m = Model(10000, 1, 1, init_distribution = [0, 1, 1, 0], state_t = "uniform")
File "C:\Users\Diru\Desktop\Internship\Sketch\classes\model.py", line 53, in __init__
a = Agent(id_, i, self, production_i, h)
File "C:\Users\Diru\Desktop\Internship\Sketch\classes\agent.py", line 31, in __init__
self.cs = ClassifierSystem(self)
File "C:\Users\Diru\Desktop\Internship\Sketch\classes\classifier_system.py", line 17, in __init__
self.classifiers = self.allClassifiers()
File "C:\Users\Diru\Desktop\Internship\Sketch\classes\classifier_system.py", line 41, in allClassifiers
cs.append(Classifier(own, partner, decision, i))
File "C:\Users\Diru\Desktop\Internship\Sketch\classes\classifier.py", line 7, in __init__
self.own_storage = own_storage
TypeError: descriptor 'own_storage' for 'Classifier' objects doesn't apply to 'Classifier' object
Я видел несколько примеров того, как использовать ___ слоты __, но я не могу понять, где я совершаю ошибку. Спасибо за вашу помощь.
РЕДАКТИРОВАТЬ: Если я попробую этот код, он будет работать
class Classifier() :
__slots__ = ('own_storage', 'partner_storage', 'decision', 'strength')
def __init__(self, own_storage, partner_storage, decision, strength) :
self.own_storage = own_storage
self.partner_storage = partner_storage
self.decision = decision
self.strength = strength
c = []
for i in range(0, 70) :
c.append(Classifier(1, 2, 1, i))
Кроме того, если я поместил последние 3 строки этого кода внутри функция allClassifiers (третий раздел кода, который я поставил в вопросе), это работает.
РЕДАКТИРОВАТЬ 2: Я не понимаю, как работает Spyder. Запустив программу из оболочки, она отлично работает в любом случае. С помощью Spyder, после удаления переменных предыдущего запуска, теперь работает версия слота, и версия без него дает мне эту ошибку:
Traceback (most recent call last):
File "C:\Users\Diru\Desktop\Internship\Sketch\classes\test.py", line 53, in <module>
m = Model(10000, 1, 1, init_distribution = [0, 1, 1, 0], state_t = "uniform")
File "C:\Users\Diru\Desktop\Internship\Sketch\classes\model.py", line 53, in __init__
a = Agent(id_, i, self, production_i, h)
File "C:\Users\Diru\Desktop\Internship\Sketch\classes\agent.py", line 31, in __init__
self.cs = ClassifierSystem(self)
File "C:\Users\Diru\Desktop\Internship\Sketch\classes\classifier_system.py", line 17, in __init__
self.classifiers = self.allClassifiers()
File "C:\Users\Diru\Desktop\Internship\Sketch\classes\classifier_system.py", line 41, in allClassifiers
cs.append(Classifier(own, partner, decision, i))
File "C:\Users\Diru\Desktop\Internship\Sketch\classes\classifier.py", line 7, in __init__
self.own_storage = own_storage
AttributeError: 'Classifier' object has no attribute 'own_storage'
По крайней мере, теперь я знаю, что проблема в том, что я не не знаю, как использовать Spyder