python - 对象的描述符不适用于对象,使用 __slots__
问题描述
早上好,
我在尝试在我的一门课程中使用 __ 插槽 __ 时遇到问题。我想用它来优化 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
这是我创建 Classifier 的所有实例的地方(它是另一个类的方法)
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 的工作方式有一些我不明白的地方。从 shell 运行程序,它在任何情况下都能完美运行。使用 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
解决方案
我面临着同样的问题。
解决方案:重新启动 Spyder。
希望它能解决问题。
推荐阅读
- javascript - 在按钮/文本单击上显示 WordPress Elementor 中的隐藏部分
- cmake - CMake查找项目中兄弟路径中定义的函数
- python-3.x - DRF auth_token "non_field_errors": [ "无法使用提供的凭据登录。" ] 使用自定义用户模型
- azure - Azure ML Studio 中的 Evaluate Model Node 不会在混淆矩阵中获取数据集的所有行
- azure-devops-rest-api - 如何使用 HttpRepl 进行身份验证以测试受保护的 api?
- math - 如果我在图像上有矩形,然后将图像旋转 90 度,那么矩形的新坐标是多少?
- google-apps-script - 当一个或多个单元格在一个范围内发生变化时运行触发脚本
- ffmpeg - Webm 是否支持封面艺术?
- data-structures - Dijkstra的最短路径算法优化
- python - 使用 tf.keras.metrics.Accuracy 时,“不允许使用 tf.Tensor 作为 Python bool”