Python的名称延伸功能(Python name mangling function)

2019-07-29 22:13发布

有没有在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)

Answer 1:

它看起来像编译器模块具有这样的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)


文章来源: Python name mangling function