Python:以有组织的方式引用“私有”变量名称
假设我有一个类,我想在这个类里面引用一些元素,比如说我想复制一个字典,然后删除那些不能被序列化的属性。
问题是,这些属性是“私有”的,所以我的代码看起来就像这样:
class MyClasss(object):
def __init__(self):
self.__prv=1
def __getstate__(self):
ret=self.__dict__.copy()
del ret['_MyClass__prv']
在删除属性的时候,我必须明确写出类名,这让我觉得有点别扭。
有没有什么更好的办法呢?比如说像这样 MyClass.getPrivateString('prv')
。
当然我可以自己实现一个方法,但我会很惊讶如果没有现成的解决方案来处理这个问题。
5 个回答
1
你可以尝试先复制这个对象,然后把它的私有属性删掉,最后返回它的 __dict__
,大概是这样的:
class X:
def __init__(self):
self.__prv = 0
def del_privates(self):
del self.__prv
def __getstate__(self):
other = X()
other.__dict__ = self.__dict__.copy()
other.del_privates()
return other.__dict__
在调用 __getstate__
之后,返回的字典里就不会有 __prv
这个成员了,因为当调用 other.del_privates()
时,它会被删掉。
6
可以考虑只用一个下划线来表示私有属性。这些属性仍然被视为私有,但不会被改名。
class MyClasss(object):
def __init__(self):
self._prv=1
def __getstate__(self):
ret=self.__dict__.copy()
del ret['_prv']
1
最后,我用了thieger的解决方案的一个变种。
del ret["_%s__%s" % (MyClasss.__name__, "prv")]
我觉得这是我能写的最稳妥的代码,当然如果放弃混淆代码的话,可能会更好,但我当时是在问如果真的需要混淆该怎么办呢 :)