python - 私有(private)名称修改功能

标签 python oop name-mangling

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/

相关文章:

c++ - 如何调用对未覆盖的派生类函数的调用?

C# - 接口(interface)/类设计问题

python:在动态创建的类中进行名称修改

python - 是否可以在 Python 中从子类调用父类私有(private)方法?

python - 用于测试的 MQTT 代理

Python 字符串列表和正则表达式列表,找到不匹配的字符串的干净方法?

python - 使用 GeoDjango 获取相关位置字段

c++ - 糟糕 : the __cmp__ function

c# - 使用 DlImport、Entrypoint 从 C# 调用命名空间中的 C++ 函数

python - 根据 Pandas 数据框中的另一列获取子字符串