【问题标题】:Object has no attribute Error when calling __getattribute__ on singleton object [closed]在单例对象上调用 __getattribute__ 时,对象没有属性错误 [关闭]
【发布时间】:2019-12-22 02:19:11
【问题描述】:

这是我快速实现的单例对象(与The Singleton template 中的第二个示例非常相似)。

class Model(object):
  class __Model:
    def __init__(self):
        self.val = None

    def __str__(self):
        return repr(self) + self.val

    instance = None

    def __new__(cls):  # __new__ always a classmethod
        if not Model.instance:
            Model.instance = Model.Model()
        return Model.instance

    def __getattr__(self, name):
        return getattr(self.instance, name)

    def __setattr__(self, name):
        return setattr(self.instance, name)

    def __getattribute__(self, bool_custom_trained):
        return getattr(self.instance, bool_custom_trained)

    def __setattr__(self, bool_custom_trained):
        return setattr(self.instance, bool_custom_trained)

我在两个脚本中使用该对象。首先

print(self.model.__getattribute__('bool_custom_trained'))

打印和设置属性值工作正常,但第二次我不能使用值,生成的错误是:

    **print(self.model.__getattribute__('bool_custom_trained'))
AttributeError: 'Model' object has no attribute 'bool_custom_trained'**

我应该检查什么?

【问题讨论】:

  • 这些都没有任何意义。有太多的错误和太多的上下文缺失,我们无法判断其中的任何一个应该是什么样子。
  • 没有Model.Model 类,我不知道为什么Model.__Model 存在,你有两个__setattr__s 并且都坏了,我不知道你为什么甚至试图在没有意义的情况下执行self.model.__getattribute__('bool_custom_trained'),您的一些方法会出于某种奇怪的原因尝试访问self.instance,而这一切都没有触及所有缺失的上下文。您的代码严重混乱。
  • 一些没有意义的东西是从你正在阅读的资源中继承而来的,这也是没有意义的。它太老了,看起来有人试图在不了解它们的情况下更新它以获得新的语言功能。不过,即使在更新之前,它也不是很好。
  • 我只是尝试快速实现单例,因为我只需要一个对象,并且需要从多个地方调用同一个对象。我想把它用作一种全局存储。由于我仍然不擅长 python 语法,我用谷歌搜索了单例 python,并根据我提供的链接,我采用了该实现并使用额外的属性 bool_custom_trained 对其进行了修改。
  • @intersect 整个程序的目的是什么?这似乎已经演变成XY problem 的情况。

标签: python getattribute


【解决方案1】:
  1. 扔掉整本书(python-3-patterns-idioms-test.readthedocs.io,“Python 3 Patterns, Recipes and Idioms”)。

  2. 创建一个实例,因为这不是 Java。

    from dataclasses import dataclass
    
    
    class Model:
        def __init__(self):
            self.name = ''
            self.bool_custom_trained = False
    
    
    model_instance = Model()
    
  3. 如果你不相信自己不会创建更多Models,你可以在之后del Model

【讨论】:

    猜你喜欢
    • 2017-07-22
    • 2021-08-25
    • 2018-05-21
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多