python:在动态创建的 class 中进行名称修改
python: name mangling in a dynamically created class
我想做这样的事情
def make_class(name : str)->type:
class Ret:
__name__ = name
def __init__(self):
self.__x = 0
return Ret
A = make_class('A')
a = A()
assert a._A__x == 0
基本上,我想要的是创建一个类型,以便它根据动态标识符破坏其成员,但上面的示例不起作用。 Metaclasses 也没有。
我能想到的唯一解决方案是:
执行整个 class 定义
exec("""
class {}:
def __init__(self):
self.__x = 0
""".format(name))
或通过getattr设置属性
class Ret:
def __init__(self):
setattr(self,'_'+name+"__x",0)
但由于种种原因,两者都不好看,请问有正确的做法吗?
Python 名称修改基本上是静态的。它在字节码编译时执行,在函数的 name
参数可用之前。要动态调用此机制,您必须动态编译代码,这意味着您必须使用 exec
或类似的东西。
我想做这样的事情
def make_class(name : str)->type:
class Ret:
__name__ = name
def __init__(self):
self.__x = 0
return Ret
A = make_class('A')
a = A()
assert a._A__x == 0
基本上,我想要的是创建一个类型,以便它根据动态标识符破坏其成员,但上面的示例不起作用。 Metaclasses 也没有。
我能想到的唯一解决方案是:
执行整个 class 定义
exec("""
class {}:
def __init__(self):
self.__x = 0
""".format(name))
或通过getattr设置属性
class Ret:
def __init__(self):
setattr(self,'_'+name+"__x",0)
但由于种种原因,两者都不好看,请问有正确的做法吗?
Python 名称修改基本上是静态的。它在字节码编译时执行,在函数的 name
参数可用之前。要动态调用此机制,您必须动态编译代码,这意味着您必须使用 exec
或类似的东西。