列出所有 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__
方式的优点是保持对 属性 标识符的引用
编辑: 下面的方法在使用 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__
方式的优点是保持对 属性 标识符的引用