【问题标题】:Python 3.9 Initializing constants of class with static methods yields errorPython 3.9 使用静态方法初始化类的常量会产生错误
【发布时间】:2021-04-15 23:36:40
【问题描述】:

我正在尝试在 python3.9 中创建一个类,以通过从静态方法加载文件来动态加载该类的常量值,如下所示:

class SQLQueries(object):

    CLIPAPP = SQLQueries.load_query_statement('clinapp.sql')

    MENSALIDADES = SQLQueries.load_query_statement('mensalidades.sql')

    SINISTRO = SQLQueries.load_query_statement('sinistro.sql')


    @staticmethod
    def load_query_statement(sql_file, format_params=None):
        curr_dir = os.getcwd()
        sql_dir = os.path.join(curr_dir, 'queries', sql_file)
        with open(sql_dir, 'r') as sql:
            query = sql.read()
            query = query.format(format_params)
        return query

但是这样做时,会产生以下错误:

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-49-ddf4f8beb954> in <module>
----> 1 class SQLQueries(object):
      2 
      3     CLIPAPP = SQLQueries.load_query_statement('clinapp.sql')
      4 
      5     MENSALIDADES = SQLQueries.load_query_statement('mensalidades.sql')

<ipython-input-49-ddf4f8beb954> in SQLQueries()
      1 class SQLQueries(object):
      2 
----> 3     CLIPAPP = SQLQueries.load_query_statement('clinapp.sql')
      4 
      5     MENSALIDADES = SQLQueries.load_query_statement('mensalidades.sql')

NameError: name 'SQLQueries' is not defined

我该如何解决这个问题?

【问题讨论】:

  • SQLQueries 在类定义语句中不存在
  • 但更重要的是,这个类的point是什么?它只有一堆类变量和一个静态方法。这应该不是一个类。最简单的解决方案就是将此 staticmethod 设为模块级函数。

标签: python python-3.x static-methods static-members mysql-loadfile


【解决方案1】:

我该如何解决这个问题?

不这样做。

首先,您从三个方面误解了 Python 的执行模型

  • 抛开控制流不谈,Python 代码从上到下线性执行
  • 类语句的“主体”是执行代码,执行环境(作用域)有一些魔力,仅此而已
  • 在类主体完全执行之前不会创建类对象

本质上,

class Foo:
    ...

是语法糖:

def Foo_body():
    ...
    return locals()
Foo = type('Foo', (object,), Foo_body())

从这里你可以看到两件事:

  • 类体语句不可能引用类体中跟随它的东西
  • “方法”只不过是一个标准的常规函数​​,直到主体完全执行完毕

其次,静态方法在 Python 中很少有用,正如近 20 年前的旧 Python is not Java 文章所述:

Java 中的静态方法不会转换为 Python 类方法。 [...] Java 静态方法的惯用翻译通常是模块级函数,而不是类方法或静态方法。

所以

  • 如果您正在编写静态方法,则不应
  • 如果你正在编写一个类方法,你应该认真考虑是否真的需要它,例如您可能需要覆盖非默认构造函数(这基本上是用例)

否则……只写一个函数。功能很酷。在这里你应该只写一个函数,静态方法没有理由。

坦率地说,我不确定课程本身是否有用。

【讨论】:

    猜你喜欢
    • 2021-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    相关资源
    最近更新 更多