12

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)
4

1 回答 1

17

看起来编译器模块对此有一个 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 源代码),如果您只想将其复制到源代码中或验证您的版本是否等效:

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)
于 2012-06-13T23:05:04.680 回答