【问题标题】:How to create constant C like struct objects under a namespace in Python如何在 Python 的命名空间下创建类似 C 的常量对象
【发布时间】:2020-11-19 01:24:19
【问题描述】:

我想创建一个可以在其他类和函数中反复使用的类的常量对象

# Simple C like struct
class data:
  def __init__(self,a,b)
    self.a = a
    self.b = b

# Constant objects in a namespace ??
class DATA_CONSTANTS:
  DATA1 = data(0,0)
  DATA2 = data(3,5)
  DATA3 = data(43, 23)

如果我现在想使用 DATA_CONSTANTS.DATA1,它是在第一次调用时创建还是在我每次引用此对象时创建?

我正在寻找类似于在 C++ 中的东西,您可以在全局或给定命名空间中创建常量对象,这些对象可以作为具有完全限定名称的常量对象重用,例如 DATA_CONSTANTS::DATA1 或 DATA_CONSTANTS::DATA2 等。

但是我不确定我在上面所做的是否是在 Python 中完成相同操作的 Python 方式。这是正确的吗?

【问题讨论】:

  • "如果我现在想使用 DATA_CONSTANTS.DATA1,它是在第一次调用时创建还是每次我引用这个对象时创建?"作为类定义语句的结果,对象(一个类)被创建一次。从未创建过其他对象,为什么会这样?
  • Python 并没有真正的用户定义常量,顺便说一句,只有约定
  • 我将枚举用于模块范围的常量。 docs.python.org/3/library/enum.html
  • 你也使用DATA_CONSTANTS = types.SimpleNameSpace(DATA1 = data(0,0), DATA2 = data(3,5), DATA3 = data(43, 23))

标签: python object static constants


【解决方案1】:

在类的上层声明的变量是class variables,并且只在声明它们的站点上创建一次,然后它们保持不变。你可以自己看看:

def calc_value():
    print("computed the value")
    return 1

class Foo:
    my_var = calc_value()

print(Foo.my_var + Foo.my_var)
# prints "computed the value" then 2

【讨论】:

  • 鉴于 C++ 中的 OPs 背景,我认为我们需要准确了解 declared 这个词。变量/属性在 Python 中从不声明。当它们被分配到时,它们就存在了。类定义语句是可执行代码,本质上是对type 构造函数的调用的精细语法糖,例如Foo = type('Foo', (object,), {'my_var':calc_value()})。在这方面,OP 需要放弃很多来自名义上类型化、相对低级和静态编译的语言的想法。
  • 因此,再次过于迂腐,“仅在程序启动时创建一次”具有误导性,类定义语句运行时或直接使用各种方式(如手动调用上面的type 构造函数)。您可以将类定义放在循环、函数等中
猜你喜欢
  • 2017-12-30
  • 2016-06-28
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2012-03-14
相关资源
最近更新 更多