rec*_*gle 10 python oop name-mangling
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)
Run Code Online (Sandbox Code Playgroud)
And*_*ark 15
它看起来像编译器模块具有这样的Python实现,签名是mangle(name, klass)
这里klass
是类的名字,而不是对象本身.
以下是访问和使用它的方法:
>>> from compiler.misc import mangle
>>> mangle('__some_such', 'Foo')
'_Foo__some_such'
Run Code Online (Sandbox Code Playgroud)
请注意,自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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2076 次 |
最近记录: |