为什么Python没有真正的常量?这不危险吗?

时间:2017-01-16 17:30:47

标签: python

Python 3

我通过一本书学习Python。现在我了解到Python在这个意义上没有常量,它们可以在C ++或C#中使用......例如,可以编写这样的危险代码:

>>> import math
>>> math.pi
3.141592653589793
>>> math.pi = 123.456
>>> math.pi
123.456
>>> 
嗯......对我来说这是一个令人不快的惊喜......

即。可能我没有受到保护,因为我加载到我的代码中的任何模块(不是我的)可能会损坏不会发生变化的数据。

为什么在Python中它是如此制作的?这不危险吗?

3 个答案:

答案 0 :(得分:11)

Python是一种动态语言:您可以添加/删除/修改对象的属性和功能,以满足您的需求。虽然这有点大胆,但基本上一个对象只不过是一本字典。您可以简单地将属性添加到一个对象等.Python还支持 - 或多或少 - duck typing的想法:

  

"如果它看起来像鸭子,像鸭子一样嘎嘎叫,它就像鸭子一样......#/ em>

换句话说,如果你想让一个对象看起来像某个函数所期望的另一个对象,只需给它羽毛和腿并删除它的第二个头部,该函数就会接受它。

这是Python的设计原则之一,它非常有用:假设你想在一段代码中修补一个函数,你可以简单地说:

def better_function(param,eter):
    #...
    pass

somemodule.badfunction = better_function

然后修复代码。此外,如果有一个软件包可以用网页做一些不错的事情,你可以通过重写一些方法轻松地修改它以便用打印机做事。

缺点确实是你对引入错误的模块的控制较少(故意的;我并没有声称他们这样做,尽管不能排除恶意意图)。有一些方法可以保护您的代码,例如使classesobjects不可变:您可以覆盖调用的__setattr____delattr__函数来设置和删除属性因此很难/不可能改变一个对象,但这会破坏Python的动态:Python程序员期望他们可以改变一个对象。

对象/类/ ...的严重保护是违反动态语言的原则的。如果您需要一种可以保证此类内容的语言,最好使用静态类型语言,例如

答案 1 :(得分:3)

Python是一种特殊的编程语言,因为它强烈依赖于您的工作卫生而不是内置机制。如果你想维护一个大的python项目,你不能没有单元测试,代码审查等,但是再一次,你需要在其他所有技术中。

一旦您进行了代码审核,您就不需要进行任何争论,因为即使是最缺乏经验的审核人员也会注意到您正在更改IN_THIS_CONVENTION或名为{{1}}的内容,这可能不太好想法。

答案 2 :(得分:2)

另外。

为了防止错误,你可以在类

中使用这样的代码
class C:
    def __init__(self):
        self.__a = 0

    @property
    def a(self):
        return self.__a

    @a.setter
    def a(self, new_value):
        raise Exception('YOU CAN NOT MODIFY A')

c = C()
# print(c.__a) # can not access to __a
print(c.a)
# c.a = 2 # can not set new value for __a via c.a

但在此表单中,您也可以通过

修改__a
c._C__a = 2
print(c.a)

我认为这足以防止错误。