列出所有 python3 class 属性

List all python3 class properties

编辑: 下面的方法在使用 class 时有效,但在使用实例时无效。他们也在 Python3 工作。

class A:
    @property
    def p(self):
        return ""

>>> a = A()
>>> vars(a)
{}
>>> vars(A)
{'p': <property object at 0x0000000000000000>, '__module__': '__main__', '__doc__': None}
>>>

============================================= =====

我正在寻找一种方法来列出在 python3 中的 class 中使用 @property 装饰器(并且仅那些)定义的所有属性。

在 python2 中,您可以使用 vars 并获取所有属性,这些属性是 property class 的一个实例(如之前的许多答案中所述),但是在 python3 中它不能这样工作并且 vars 没有 return 属性。使用 __dict__ 与使用 vars 相同。

使用dir() return所有的属性,并且不让区分属性和其他属性。

此外,当访问 属性 时,它具有 returned 值的类型,而不是 property.

的实例

我的最终目标是定义我自己的属性类型(通过继承property),并列出每个类型的属性。

这是交互式 REPL 中的一个示例,将演示如何执行此操作:

>>> class Foo:
...   @property
...   def bar(self):
...     return self
...     
>>> f = Foo()
>>> f.bar
<__main__.Foo object at 0x11b197828>
>>> Foo.bar
<property object at 0x11b677548>
>>> f.__class__.__dict__['bar']
<property object at 0x11b677548>
>>> vars(f)
{}
>>> vars(Foo)
mappingproxy({'__module__': '__main__', 'bar': <property object at 0x11b677548>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None})
>>> vars(Foo) == Foo.__dict__
True
>>> type(f) is f.__class__ is Foo
True
>>> {k:v for k, v in vars(Foo).items() if isinstance(v, property)}
{'bar': <property object at 0x11b677548>}
>>> {k:v for k, v in vars(type(f)).items() if isinstance(v, property)}
{'bar': <property object at 0x11b677548>}
>>> dir(Foo)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'bar']
>>> dir(f)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'bar']
>>> [d for d in dir(f) if isinstance(getattr(f, d), property)]
[]
>>> [d for d in dir(Foo) if isinstance(getattr(Foo, d), property)]
['bar']

可以列出 class 的所有 属性 个实例:

dir方式

class A():
    def __init__(self): pass
    @property
    def c(self): return self._c
    @c.setter
    def c(self, v): self._c = v

    @property
    def d(self): return self._c
    @c.setter
    def d(self, v): self._c = v

props =  = filter(lambda attr: isinstance(v, property), [getattr(A, i) for i in dir(A)])

print(list(props))

输出

[<property object at 0x7fee3a1470e0>, <property object at 0x7fee3a147130>]

__dict__方式

props = {k: v for k, v in A.__dict__.items() if isinstance(v, property)}
print(list(props))

输出

{'c': <property object at 0x7efd84c21090>, 'd': <property object at 0x7efd84c210e0>}

__dict__方式的优点是保持对 属性 标识符的引用