我有一个问题类似于此处提出的问题:Importing a long list of constants to a Python file
基本上,我有一个单独的模块,它只包含很长的常量列表,例如
constants.py
x = 1.2
y = 30.4
.
.
.
在另一个模块中,我想导入这些常量并将它们初始化为实例属性。
class.py
class something(object):
def __init__(self):
import constants
self.x = constants.x
self.y = constants.y
.
.
.
是否有更简单或更pythonic的方式来执行此操作而不是重新输入所有变量名称?
答案 0 :(得分:1)
你可以做到
for constant, value in constants.__dict__.values():
setattr(self, constant, value)
为什么需要它们作为实例属性?
答案 1 :(得分:1)
您可以将常量放在模块中的类中。这个类可以更容易传递,或者用作任何需要这些常量作为类属性的类的mixin类。
class Constants(object):
x = 1.2
y = 30.4
# optional
class Base(object):
pass
class Something(Constants, Base):
pass
s = Something()
print(s.x)
然而,由于它只是数据,我可能只是使用某种类型的数据结构(如字典)来保存它们。我不确定为什么你需要将它们作为类属性,当任何代码只能从模块中引用它们时。
答案 2 :(得分:1)
总有类似的东西:
class something(object):
def __init__(self):
import constants
for name in ['x', 'y', ...]:
setattr(self, name, getattr(constants, name))
这样做的好处是可以避免多次代表self.X = constants.X
,并且意味着您只在一个地方列出名称。
你可以使用它:
for name, value in constants.__dict__.iteritems():
setattr(self, name, value)
要获取constants
中绑定的所有名称而不明确列出它们,但我个人不会。它使something
对象实际拥有的属性变得更加清晰,而且非常很容易让Python模块最终包含比你意识到的更多的名字。例如,如果您在定义所有常量的过程中必须在math
中导入另一个模块(例如,constants
),那么您最终会得到意外的math
属性您的所有something
个实例。
我认为明确列出您要导入的名称更清晰。另外,如果您发现需要为程序的其他部分添加更多常量(并且常量只能与{{1相关),则意味着您不会影响所有something
实例。那么它们确实应该列在something
中,而不是在外部模块中。
答案 3 :(得分:1)
Python开发人员开发了一个很酷的解决方案:它被称为ConfigParser。
一个实际例子:config.ini
[constants]
key = value
x = 0
y = 1
class.py
from ConfigParser import SafeConfigParser
class MyClass(object):
def __init__(self, **kwargs):
self.config = SafeConfigParser(defaults=kwargs).read('config.ini')
def get_x(self):
return self.config.get('constants', 'x')
我希望这会有所帮助。
编辑:如果您需要实例属性,可以执行以下操作:
class MyClass(object):
...
def __getattr__(self, key):
return self.config.get('constants', key)
EDIT2:需要一个Python文件,而.ini文件不是解决方案吗?
from . import config
class Myclass(object):
def __getattr__(self, key):
return getattr(config, key)
答案 4 :(得分:0)
from constants import x, y
请确保您以后不小心过度使用变量(即不要使用通用名称)