Python 3
我通过一本书学习Python.现在我了解到Python在这个意义上没有常量,它们在C++或C#中可用...例如,可以编写这样的危险代码:
>>> import math >>> math.pi 3.141592653589793 >>> math.pi = 123.456 >>> math.pi 123.456 >>>
嗯......对我来说这是一个令人不快的惊喜......
即我可能没有受到保护,因为我加载到我的代码中的任何模块(不是我的)都可能损坏不会改变的数据.
为什么在Python中它是如此制作的?这不危险吗?
Python是一种动态语言:您可以添加/删除/修改对象的属性和功能,以满足您的需求.虽然这有点大胆,但基本上一个对象只不过是一本字典.您可以简单地将属性添加到一个对象等.Python还支持 - 或多或少 - 鸭子类型的想法:
"如果它看起来像鸭子,像鸭子那样嘎嘎叫,它就是一只鸭子".
换句话说,如果你想让一个对象看起来像某个函数所期望的另一个对象,只需给它羽毛和腿并删除它的第二个头,函数就会接受它.
这是Python的设计原则之一,它非常有用:假设您想在一段代码中修补函数,您可以简单地:
def better_function(param,eter): #... pass somemodule.badfunction = better_function
从而修复代码.此外,如果有一个软件包可以用网页做一些不错的事情,你可以通过重写几种方法轻松地修改它来做打印机.
缺点确实是你对引入错误的模块的控制较少(故意的;我并没有声称它们会这样做,尽管不能排除恶意意图).有一些方法来保护你的代码,例如制作类和对象不变:您可以覆盖__setattr__
和__delattr__
函数被调用来设置和删除属性,从而使其难以/不可能改变的对象,但这会破坏活力Python:Python程序员希望他们可以改变一个对象.
然而,对象/类/ ...的重度保护违背了动态语言的原则.如果你想要一种保证这种东西的语言,你最好使用像haskell这样的静态类型语言.