在Python对象中,如何查看使用@property装饰器定义的属性列表?

fd3cxomn  于 2023-09-29  发布在  Python
关注(0)|答案(5)|浏览(112)

我可以看到使用self.__dict__的一级成员变量,但我还希望看到一个属性字典,如@property装饰器所定义的。我该怎么做?

0pizxfdo

0pizxfdo1#

你可以在你的类中添加一个函数,看起来像这样:

def properties(self):
    # class_items = self.__class__.__dict__.iteritems()  # Python 2
    class_items = self.__class__.__dict__.items()
    return dict((k, getattr(self, k)) 
                for k, v in class_items 
                if isinstance(v, property))

这将查找类中的所有属性,然后创建一个字典,其中包含具有当前示例值的每个属性的条目。

o8x7eapl

o8x7eapl2#

属性是类的一部分,而不是示例的一部分。因此,您需要查看self.__class__.__dict__或等效的vars(type(self))
所以这些属性是

[k for k, v in vars(type(self)).items() if isinstance(v, property)]
6kkfgxo0

6kkfgxo03#

对于对象f,这给出了作为属性的成员列表:

[n for n in dir(f) if isinstance(getattr(f.__class__, n), property)]
2nc8po8w

2nc8po8w4#

正如user2357112-supports-monica在一个重复问题的注解中指出的那样,接受的答案只得到那些直接定义在类上的属性,而没有继承的属性。为了解决这个问题,我们还需要遍历父类:

from typing import List

def own_properties(cls: type) -> List[str]:
    return [
        key
        for key, value in cls.__dict__.items()
        if isinstance(value, property)
    ]

def properties(cls: type) -> List[str]:
    props = []
    for kls in cls.mro():
        props += own_properties(kls)
    
    return props

举例来说:

class GrandparentClass:
    @property
    def grandparent_prop(self):
        return "grandparent_prop"   

class ParentClass(GrandparentClass):
    @property
    def parent_prop(self):
        return "parent"

class ChildClass(ParentClass):
    @property
    def child_prop(self):
        return "child"

properties(ChildClass)  # ['child_prop', 'parent_prop', 'grandparent_prop']

如果需要获取示例的属性,只需将instance.__class__传递给get_properties即可

rdlzhqv9

rdlzhqv95#

dir(obj)给出了obj的所有属性的列表,包括方法和属性。

相关问题