【发布时间】:2012-06-16 23:16:02
【问题描述】:
Python 标准库中是否有一个函数可以用“私有”属性名称重现 Python 的名称修改方案?好像会有,但我一辈子都找不到。
这是我写的,但如果有更好的方法,我会全力以赴。
def mangle_name (cls, attrname) :
prefix = '_' + cls.__name__.lstrip('_')
if not attrname.startswith('__') :
attrname = '__' + attrname
if not attrname.endswith('__') :
return prefix + attrname
else :
return attrname
class Foo :
__some_such = 3
name = mangle_name(Foo, '__some_such')
print name
print hasattr(Foo(), name)
【问题讨论】:
-
我很确定标准库中没有这样的功能。你需要它做什么?
-
我可以想象这几乎总是会被用来做坏事。
-
Lattyware 的预测得到证实。
-
这就是为什么使用错误名称作为“私人”名称是一个坏的想法,恕我直言。如果您想将名称标记为私有以吓唬人们不要在外部使用它,只需使用一个下划线即可。名称修改不是为创建私有名称而设计的,它旨在在继承层次结构中的多个类可能想要使用相同名称时消除名称的歧义(因为 Python 的对象模型意味着继承层次结构中的所有类共享实例中相同的属性命名空间)。
-
我写了一个装饰器,它在运行一个函数之前“断言”一个属性值。在这种情况下,能够让用户断言甚至是私有属性是很好的。我没有这样做,但让外部函数访问私有属性是一个正当的理由。这就是把我带到这里的原因:stackoverflow.com/questions/12537904/…
标签: python oop name-mangling