python中包的全局变量是否可以视为邪恶?

时间:2019-01-09 06:52:34

标签: python django oop global-variables

首先,对不起我的英语不好。

最近,我读了叶戈尔·布加延科(Yegor Bugayenko)的书《优雅的物体》。本书的主题之一是致力于使用对象而不是公共常量。作者写道,公共常数纯属邪恶。造成这种情况的原因很多。例如,使用公共常量会破坏封装-如果要更改此内容,我们需要知道包的类如何使用此常量。如果项目中的两个类以其自己的方式使用此常量,则如果我们更改常量,则需要更改这两个类的代码。

作者建议不要使用全局常量,而需要创建对象,这使我们只能在一个地方更改代码。我将在下面举一个例子。

我已经阅读了关于stackoverflow的类似主题,但是没有找到有关最佳实践或用例的答案。使用对象是否比在某些文件中创建全局变量(例如“ settings.py”)更好?

是这个

class WWStartDate:

    date_as_string = '01.09.1939'

    def as_timestamp(self):
        # returns date as timestamp

    def as_date_time(self):
        # returns date as datetime object

比这更好的存储在conf.py包中的某个文件中,例如:

DATE_STRING = '01.09.1939'

如果我们正在谈论在包装的几个类别中使用此日期?

阅读本书后,我认为对象要好得多,但是在很多情况下,框架或库的开发人员迫使我们使用全局变量。所以这不是我所看到的那么简单。例如,为什么django使用这种方法?我说的是文件settings.py。

1 个答案:

答案 0 :(得分:0)

我认为,通过为常量创建一个类以将其自身以不同的形式提供给不同的(其他)类,您正在过度设计常量。为什么常数必须知道其用法? math.pi是否知道其用法?它实际上有一些方法,因为它是一个float对象。 pi常数没有特定内容。此外,当您执行此操作时,会将常量耦合到其他类,并且当它们更改其用途时,可能必须更新常量类。现在,这是个坏主意。您希望它们解耦。每个类(并且只有该类)都应该知道该常量在做什么。

这并不是说包装类有时不能用,特别是在将相关常量分组时。但是您也可以使用Enum

并且模块中的全局变量只是该模块中的全局变量。导入后,您将使用副本或(限定的)链接名称。但是,即使在链接的情况下,如果您使用限定条件更改了导入的值(您不应说它是恒定的,所以不应该这样做),而另一个模块正在导入相同的值,则它不会看到您所做的更改。他们使用不同的名称空间。当我们说全局变量是邪恶的时,这不是通常的“全局变量”概念。