【问题标题】:descriptor for objects doesn't apply to object, using __slots__对象的描述符不适用于对象,使用 __slots__
【发布时间】:2020-08-12 04:12:08
【问题描述】:

早上好,

我在尝试在我的一门课程中使用 __ 插槽 __ 时遇到问题。我想用它来优化 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,删除之前运行的变量后,现在 slot 版本可以工作,没有它的版本给我这个错误:

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

【问题讨论】:

  • 你能生成一个minimal reproducible example吗?完整的堆栈跟踪也会有所帮助
  • 谢谢@juanpa.arrivillaga,我编辑了这个问题。您的请求也让我注意到问题可能出在哪里,但我得到的错误对我来说仍然很奇怪
  • 不,这个错误不是因为 i 变量,它仍然存在,否则你会得到一个不同的错误
  • 删除之前运行从 Spyder 保存的所有变量,它不适用于 i 和任何固定值。

标签: python object typeerror descriptor slots


【解决方案1】:

我也遇到了同样的问题。
解决方法:重启 Spyder。
希望能解决问题。

【讨论】:

    猜你喜欢
    • 2020-07-26
    • 2021-09-14
    • 2020-03-18
    • 2022-01-21
    • 2020-11-01
    • 2021-10-26
    • 1970-01-01
    • 2022-11-26
    • 2020-06-30
    相关资源
    最近更新 更多