Python:以有组织的方式引用“私有”变量名称

2 投票
5 回答
812 浏览
提问于 2025-04-16 03:21

假设我有一个类,我想在这个类里面引用一些元素,比如说我想复制一个字典,然后删除那些不能被序列化的属性。

问题是,这些属性是“私有”的,所以我的代码看起来就像这样:

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")]

我觉得这是我能写的最稳妥的代码,当然如果放弃混淆代码的话,可能会更好,但我当时是在问如果真的需要混淆该怎么办呢 :)

撰写回答