首页 > 解决方案 > 如何从 python 中该类的实例中检索类变量列表?

问题描述

例如,这是以下类:

class Fruits(object):
    
    name = 'Fruits'
    short_description = 'Fruits class'
    long_description = 'Fruits class that takes in a list of fruits'
    
    def __init__(self,fruits_lst):
        
        self.fruits_lst = fruits_lst
        self.total = len(fruits_lst)

我想检索一个类变量列表,不包括任何类实例变量。那就是列表将是 ['name','short_description','long_description']。

我该怎么做呢?

我认识到我可以部署它来提取关于班级的信息:

fruits = Fruits(['Apples','Bananas','Oranges'])

dir(fruits)

['__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__',
 'fruits_lst',
 'long_description',
 'name',
 'short_description',
 'total']

但是,我怎样才能只提取我想要的信息呢?

谢谢!

更新:

我刚刚发现我可以通过将 dir 应用于类本身而不是类的实例来做到这一点:

class_variables = [var for var in dir(Fruits) if not var.startswith('__')]
class_variables

['long_description', 'name', 'short_description']

所以,这是一个“解决方案”。但是,对于我拥有的用例,我只能访问类实例,而不是类本身。那么,有没有办法通过类实例直接提取这些信息,而不必通过列表理解进行过滤?

谢谢!

标签: python-3.xclassvariables

解决方案


看起来仍然很老套,但是:

[i for i in vars(Fruits).keys() if not i.startswith('__')]
# in case of instance
[i for i in vars(fruits.__class__).keys() if not i.startswith('__')]

至少要过滤的值更少

更新

防止在列表中获取类方法名称

attribute_list = []
for k, v in vars(Fruits).items():
    if not k.startswith('__') and not callable(v):
            attribute_list.append(k)

推荐阅读