【问题标题】:How to get dict of defined class attributes exclusive of magic methods/attributes?如何获取除魔术方法/属性之外的已定义类属性的字典?
【发布时间】:2019-03-15 18:32:45
【问题描述】:

基本上,我正在做的是

class A(object):
    a = 1
    b = 2

copy.deepcopy(dict(A.__dict__))

它给出了错误

TypeError: object.new(getset_descriptor) 不安全,请使用 getset_descriptor。new()

如果我更新如下代码并从类字典项中弹出 __dict____weakref__

class A(object):
    a = 1
    b = 2

attrs = dict(A.__dict__)
attrs.pop("__weakref__")
attrs.pop("__dict__")
copy.deepcopy(dict(A.__dict__))
# It gives {'__module__': '__main__', 'a': 1, 'b': 2, '__doc__': None}

它工作正常,我知道这与复制 weakref 有关,这将是错误的。

有没有更好的方法来做同样的事情,我不需要专门弹出 __dict____weakref__ 并且我只能得到 attributes 类,不包括魔法方法/属性?

【问题讨论】:

  • 那些属性。无论如何,您为什么要尝试执行深层复制?
  • 什么是类的“属性”很滑。
  • @wim 属性是我在上面的例子中定义的属性,“a”和“b”是属性或者说类成员。
  • @user2357112 这是完成一些其他工作所需的要求。

标签: python python-2.7 class


【解决方案1】:

在 Python 中并不是那么简单,因为通常没有办法知道什么是“内置”,什么不是。此外,如果您想获得继承的属性,使用__dict__ 是不够的;为此,您需要改用dir,它还可以方便地处理对象实例,就像它处理类本身一样,因此更通用。

最简单的通用解决方案是为自己定义一个简单的小函数,以“属性”的形式封装您想要的内容。然后,您可以显式删除您不想保留的属性(不过,请注意,如果您对此类过滤对象进行深度复制,您可能不再拥有可用的 Python 对象):

In [1]: {k: getattr(A, k) for k in set(dir(A)) - set(dir(object)) - {'__weakref__', '__dict__', '__module__'}}
Out[1]: {'b': 2, 'a': 1}

In [2]: class B(A):
    ...:     c = 10

In [3]: {k: getattr(B, k) for k in set(dir(B)) - set(dir(object)) - {'__weakref__', '__dict__', '__module__'}}
Out[3]: {'b': 2, 'c': 10, 'a': 1}

【讨论】:

  • 哇,我发布了完全相同的答案,但后来。大声笑。
  • @scnerd 谢谢,我知道这种方式。有没有直接的方法。让我在这里再给你一件事如果我们定义类 A(): a = 1 b = 2 without object, It doesn't contain 'weakref', 'dict'。但是这种风格的类有兼容性问题。
  • @NileshSoni 通过像这样使用集合减法,如果找不到这些值也没关系,它不会失败。魔术函数可能会在特殊情况下使用,但这并不会使它们成为特殊函数(或任何类型的特殊对象),因此我认为您不会在 Python 中找到任何可以明确告诉您是否或不是该属性是否是“魔术功能”。只需定义一个您不感兴趣的属性列表,将此逻辑包装在一个辅助函数中,并在需要属性时使用该函数。
猜你喜欢
  • 2015-09-08
  • 1970-01-01
  • 2022-12-05
  • 2020-10-04
  • 2019-05-20
  • 2015-11-22
  • 2010-10-29
  • 2011-12-18
  • 1970-01-01
相关资源
最近更新 更多