我有一个模块settings.py
,其中存储了一些其他模块要使用的变量(为了便于示例,我们将它们称为brightness
和saturation
,尽管实际的模块还有很多,而且它们的初始化要复杂得多。
此模块由其他模块导入,因此它们可以在自己的代码中使用settings.brightness
和settings.saturation
。但是,这两个变量未初始化-而是在导入None
时设置为settings
。必须通过至少调用一次settings.init()
来初始化它们。 (为什么不通过将init()
放在settings.py
的末尾来自动初始化它们呢?这是有原因的……从本质上讲,我必须先做一些其他事情。)
无论如何,如果在调用brightness
之前访问了contrast
或init()
,我想能够引发一个异常。我正在考虑在导入None
时使用某种对象而不是settings
(这将在访问时引发异常),但是我想不出一种方法来实现,也没有我认为那将是一个好的设计。任何帮助表示赞赏!
答案 0 :(得分:1)
正在考虑在导入设置时使用某种对象而非“无”(在访问时会引发异常)
这不是它的工作原理...通过在其容器对象上查找该对象的名称来“访问”该对象(通过id lucky_number
0 10
1 20
5 60
4 50
3 40
2 30
,它是'dot'运算符的实现),因此只有容器可以检测到“访问”。在您的情况下,容器是一个模块,因此您无法覆盖object.__getattribute__()
。
此处可能的解决方案是强制客户端代码使用函数来获取值(这是不切实际的),或者-如pasupati解释的那样-将整个内容包装到自定义类中并使用属性来控制访问。您最终可能会使该类成为单身汉...
NB:
因为设置类必须在使用前分配给某个变量。如果模块名称是settings,例如,它在末尾分配settings = Settings(),则为了引用此对象,其他模块将必须调用settings.settings.get_brightness()。
__getattribute__
是另一种选择,但这会违反直觉
没有人强迫您将模块命名为from settings import settings
;-)
Django正在做类似的事情(将设置包装在自定义类实例中),并且要从中导入的模块名为'django.conf',因此您可以进行settings.py
。
答案 1 :(得分:0)
您可以改为使用属性的getter和setter
class setting:
def __init__(self):
self.__brightness=None
@property
def Brightness(self):
if(self.__brightness==None):
raise BaseException("Trying to access a value which is not set")
else:
return self.__brightness
@Brightness.setter
def Brightness(self,value):
self.__brightness=value
s = setting()
try:
s.Brightness
except BaseException as e:
print(e)
s.Brightness=1
print(s.Brightness)