当前位置: 首页 > 知识库问答 >
问题:

python3.12 为什么无法调用__init__中的属性?

全弘深
2023-12-26

使用了python 3.12编写下列程序 运行时报错

class GetConfig(object):    def __int__(self):        current_dir = os.path.dirname(os.path.abspath(__file__))        print(current_dir)        sys_cfg_file = os.path.join(current_dir, "sysConfig.cfg")        self.conf = configparser.ConfigParser()        self.conf.read(sys_cfg_file)    def get_db_host(self):        db_host = self.conf.get("DB", "host")        return db_hostif __name__ == "__main__":    gc1 = GetConfig()    var = gc1.get_db_host()

报错信息:

Traceback (most recent call last):  File "D:\Code\InterfaceCrawlTool\getConfig.py", line 48, in <module>    var = gc1.get_db_host()          ^^^^^^^^^^^^^^^^^  File "D:\Code\InterfaceCrawlTool\getConfig.py", line 21, in get_db_host    db_host = self.conf.get("DB", "host")              ^^^^^^^^^AttributeError: 'GetConfig' object has no attribute 'conf'

为什么会提示找不到属性呢?我尝试在__init__方法中加入self.name="test",然后使用
gc1 = GetConfig()
gc1.name 也是报同样的错误

共有3个答案

吕高昂
2023-12-26

Dube, 尽管他们很相似, 但是双胞胎也是有区别的。你写的是 __int__, 少了字母 i, 那可就不是python官方承认的 __init__了。

施慈
2023-12-26

你写的是__int__,不是__init__

丁正阳
2023-12-26

在你的代码中,你尝试在类的构造函数 __init__ 中定义一个属性 conf,但这个属性只在该函数的作用域内存在,所以它不能在类的其他方法中被访问。

在 Python 中,self 参数表示类的实例,而 self.conf 是在 __init__ 方法中定义的实例变量。这意味着,只有当你在类的实例化过程中(即创建类的对象时)调用 __init__ 方法时,这个属性才会被创建。一旦 __init__ 方法执行完毕,这个属性就不再存在,这就是为什么你在 get_db_host 方法中无法访问 self.conf 的原因。

要解决这个问题,你可以将 self.conf 的定义移出 __init__ 方法,直接在类中定义,就像这样:

class GetConfig(object):    def __init__(self):        current_dir = os.path.dirname(os.path.abspath(__file__))        print(current_dir)        sys_cfg_file = os.path.join(current_dir, "sysConfig.cfg")        self.conf = configparser.ConfigParser()        self.conf.read(sys_cfg_file)    def get_db_host(self):        db_host = self.conf.get("DB", "host")        return db_host

这样,self.conf 就会在类的实例化过程中被创建,并且在类的其他方法中都可以被访问。

 类似资料:
  • 问题内容: 假设我有多个继承方案: 有编写的两个典型方法的: (老式) (较新的样式) 但是,无论哪种情况,如果父类(和)没有遵循相同的约定,则代码将无法正常工作(某些代码可能会丢失,或被多次调用)。 那么又是什么正确的方法呢?说“保持一致,遵循一个或另一个”很容易,但是如果或来自第三方图书馆,那又如何呢?有没有一种方法可以确保所有父类构造函数都被调用(以正确的顺序,并且只能调用一次)? 编辑:看

  • 问题内容: 今天就遇到这个问题,以防其他人遇到同样的问题。 原来要让IE在动态生成的元素上运行onclick,我们不能使用setAttribute。相反,我们需要使用包装要运行的代码的匿名函数在对象上设置onclick属性。 错误提示: 你可以做 但根据@scunliffe,它将以非标准模式在IE中中断。 你根本做不到 因为它会立即执行,并将runCommand()的结果设置为onClick属性值

  • 问题内容: Python源目录中的init.py用于什么? 问题答案: 它曾经是软件包的必需部分(旧的3.3之前的“常规软件包”,而不是较新的3.3+“命名空间软件包”)。 这是文档。 Python定义了两种类型的程序包,常规程序包和名称空间程序包。常规软件包是Python 3.2及更早版本中存在的传统软件包。常规软件包通常实现为包含文件的目录。导入常规程序包时,将隐式执行此文件,并将其定义的对象

  • 问题内容: 我是刚开始学习Python的Java人。举个例子: 我肯定有很多冗余代码(我知道在Java中,上面的代码有很多冗余)。 对于已经从父类继承了哪些属性,哪些部分是多余的? 问题答案: 在python中为类编写函数时,应始终调用其超类的函数。我们可以使用它直接将相关属性传递给超类,因此您的代码如下所示: 正如其他人指出的那样,您可以替换该行 与 并且代码将执行相同的操作。这是因为pytho

  • Python @classmethod 为什么不能调用 @property 装饰的属性 ? AttributeError: 'property' object has no attribute 依然不是没清楚

  • 我有以下JSON: 我正试图用杰克逊把它转换成pojo。这就是我所拥有的: 我的另一个类有字段,这些字段被命名为JSON中的元素,并具有getter和setter。 上面的代码可以工作,但是当我只是创建一个没有配置的基本ObjectMapper对象时,它不起作用。这是为什么?这是堆栈跟踪错误: 这是我的pojo类,包含getter和setter: