Python:在动态创建的类中进行名称混淆

3

I want to do something like this

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

基本上,我想创建一种类型,以便根据动态标识符混淆其成员,但上面的示例不起作用。元类也不行。

我能想到的唯一解决方案是:

执行整个类定义

exec("""
class {}:
    def __init__(self):
        self.__x = 0
""".format(name))

或者通过getattr设置属性

class Ret:
    def __init__(self):
        setattr(self,'_'+name+"__x",0)

但由于各种原因,它们都不太吸引人,有没有正确的方法来解决这个问题呢?


1
注意,exec(...)是实际实现namedtuple的方式,因此... - juanpa.arrivillaga
1个回答

1
Python的名称混淆基本上是静态的。它在字节码编译时执行,在函数的"name"参数可用之前执行。要动态调用此机制,您必须动态编译代码,这意味着您必须使用"exec"或类似的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接