@Jon Clements 的回答非常好,但如果你愿意,你可以留在课堂上,但将所有常量转换为静态方法。
class MyConstants(object):
@staticmethod
def constant1():
return 1
然后你可以调用它:
some_variable = MyConstants.constant1()
我觉得处理这样的事情在可维护性方面更好——如果你想做除了返回常量之外的任何事情,Jon 的解决方案将不起作用,你将不得不重构你的代码。例如,您可能希望constant1
在某些时候更改 的定义:
def constant1():
import time
import math
current_time = time.time()
return math.ceil(current_time)
它将当前时间返回到最接近的秒数。
无论如何,对不起这篇文章:)
因此,鉴于此处的评论,我想我会看到以我的方式(使用工厂)与声明静态常量与在类中使用属性相比,实际开销是多少。
time_test.py
:
import time
CONSTANT_1 = 1000
CONSTANT_2 = 54
CONSTANT_3 = 42
CONSTANT_4 = 3.14
class Constants(object):
constant_1 = 1000
constant_2 = 54
constant_3 = 42
constant_4 = 3.14
class Factory(object):
@staticmethod
def constant_1():
return 1000
@staticmethod
def constant_2():
return 54
@staticmethod
def constant_3():
return 42
@staticmethod
def constant_4():
return 3.14
if __name__ == '__main__':
loops = 10000000
# static const
start = time.time()
for i in range(loops):
sum = CONSTANT_1
sum += CONSTANT_2
sum += CONSTANT_3
sum += CONSTANT_4
static_const_time = time.time() - start
# as attributes
start = time.time()
for i in range(loops):
sum = Constants.constant_1
sum += Constants.constant_2
sum += Constants.constant_3
sum += Constants.constant_4
attributes_time = time.time() - start
# Factory
start = time.time()
for i in range(loops):
sum = Factory.constant_1()
sum += Factory.constant_2()
sum += Factory.constant_3()
sum += Factory.constant_4()
factory_time = time.time() - start
print static_const_time / loops
print attributes_time / loops
print factory_time / loops
import pdb
pdb.set_trace()
结果:
Bens-MacBook-Pro:~ ben$ python time_test.py
4.64897489548e-07
7.57454514503e-07
1.09821901321e-06
--Return--
> /Users/ben/time_test.py(71)<module>()->None
-> pdb.set_trace()
(Pdb)
所以你得到了它:效率的边际收益(每千万次循环几秒钟)可能被代码中其他地方的东西所淹没。因此,我们已经确定所有三种解决方案都具有相似的性能,除非您关心这样的微优化。(如果是这种情况,您可能最好使用 C。)所有三个解决方案都是可读、可维护的,并且可能可以在任何使用 Python 的软件公司的版本控制中找到。所以区别在于美学。
无论如何,我曾经在高中的一篇研究论文中失去了 15% 的分数,因为我的参考书目格式不正确。内容完美无缺,对我的老师来说还不够漂亮。我发现人们可以花时间学习规则或解决问题。我更喜欢解决问题。