Python 标准库中是否有一个函数可以使用“私有(private)”属性名称重现 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)
最佳答案
它看起来像 compiler模块对此有一个 Python 实现,签名是 mangle(name, klass)
其中 klass
是类名,而不是对象本身。
您可以通过以下方式访问和使用它:
>>> from compiler.misc import mangle
>>> mangle('__some_such', 'Foo')
'_Foo__some_such'
请注意,编译器模块自 Python 2.6 起已弃用,并且在 Python 3.0 中不存在。
这是函数本身(来自 Python 2.7 source code ),以防您只是想将它复制到您的源代码或验证您的版本是否等效:
MANGLE_LEN = 256 # magic constant from compile.c
def mangle(name, klass):
if not name.startswith('__'):
return name
if len(name) + 2 >= MANGLE_LEN:
return name
if name.endswith('__'):
return name
try:
i = 0
while klass[i] == '_':
i = i + 1
except IndexError:
return name
klass = klass[i:]
tlen = len(klass) + len(name)
if tlen > MANGLE_LEN:
klass = klass[:MANGLE_LEN-tlen]
return "_%s%s" % (klass, name)
关于python - 私有(private)名称修改功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11024344/