Python 编写属性,而不是完全阻止它——这可能是不可能的,至少是非常困难的。(例如,我认为您可能会替换描述符对象本身。)“仅仅因为”很少是任何有能力的设计决策的理由。我不担心黑客。我只是在帮助自己避免虫子。当我经过某个容器时,我调用各种函数,这些函数可能(意外地)修
Python 编写属性,而不是完全阻止它——这可能是不可能的,至少是非常困难的。(例如,我认为您可能会替换描述符对象本身。)“仅仅因为”很少是任何有能力的设计决策的理由。我不担心黑客。我只是在帮助自己避免虫子。当我经过某个容器时,我调用各种函数,这些函数可能(意外地)修,python,reference,constants,language-design,language-features,Python,Reference,Constants,Language Design,Language Features,编写属性,而不是完全阻止它——这可能是不可能的,至少是非常困难的。(例如,我认为您可能会替换描述符对象本身。)“仅仅因为”很少是任何有能力的设计决策的理由。我不担心黑客。我只是在帮助自己避免虫子。当我经过某个容器时,我调用各种函数,这些函数可能(意外地)修改其内容。我很想知道。当然,如果你正在使用的语言有办法真正实现这些功能,那么应该使用这些功能@马克斯:为什么要把偶然突变作为细菌的重要来源?我记不起有过一次错误,因为我不小心修改了一些应该是常量的东西。然而,我确实记得有数百次我不得不修改代码,
编写属性,而不是完全阻止它——这可能是不可能的,至少是非常困难的。(例如,我认为您可能会替换描述符对象本身。)“仅仅因为”很少是任何有能力的设计决策的理由。我不担心黑客。我只是在帮助自己避免虫子。当我经过某个容器时,我调用各种函数,这些函数可能(意外地)修改其内容。我很想知道。当然,如果你正在使用的语言有办法真正实现这些功能,那么应该使用这些功能@马克斯:为什么要把偶然突变作为细菌的重要来源?我记不起有过一次错误,因为我不小心修改了一些应该是常量的东西。然而,我确实记得有数百次我不得不修改代码,因为常量注释不一致。@Paul Hankin:我有复杂的嵌套数据结构,很容易忘记在我应该做的时候制作深度副本(我修改副本以执行各种计算)。谢谢,非常有帮助。虽然我只是将兴趣限制在
const
以帮助避免bug,但这篇文章将concept
作为一种可散列数据类型涵盖了一个更“有用”/“广泛”的概念。不过,读起来还是很有趣的。Python不使用按引用传递。它使用“引用”,但通过值传递这些引用。比较def foo(x){x=10;}bar=5;富(巴);;用void foo(int&x){x=10;}/*…*/int bar=5;富(巴);;谢谢你的澄清。
# simple read only attributes with meta-class programming
# method factory for an attribute get method
def getmethod(attrname):
def _getmethod(self):
return self.__readonly__[attrname]
return _getmethod
class metaClass(type):
def __new__(cls,classname,bases,classdict):
readonly = classdict.get('__readonly__',{})
for name,default in readonly.items():
classdict[name] = property(getmethod(name))
return type.__new__(cls,classname,bases,classdict)
class ROClass(object):
__metaclass__ = metaClass
__readonly__ = {'a':1,'b':'text'}
if __name__ == '__main__':
def test1():
t = ROClass()
print t.a
print t.b
def test2():
t = ROClass()
t.a = 2
test1()