-2

我正在尝试在 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

我该如何解决?

4

1 回答 1

-1

我该如何解决?

通过不这样做。

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

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

在本质上,

class Foo:
    ...

是语法糖:

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

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

  • 类体语句不可能在类体中引用它后面的东西
  • 在主体完全执行之前,“方法”只不过是一个标准的常规函数

其次,静态方法在 Python 中几乎没有用处,而且由于近 20 年前的旧Python 不是 Java文章指出:

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

所以

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

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

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

于 2021-04-16T06:52:41.367 回答