Python 3.x 如何在python中从该类的实例检索类变量列表?

Python 3.x 如何在python中从该类的实例检索类变量列表?,python-3.x,class,variables,Python 3.x,Class,Variables,例如,下面是一个类: 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_ls

例如,下面是一个类:

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']
class_variables = [var for var in dir(Fruits) if not var.startswith('__')]
class_variables

['long_description', 'name', 'short_description']
但是,我怎样才能提取出我想要的信息呢

谢谢大家!

更新:

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

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']
class_variables = [var for var in dir(Fruits) if not var.startswith('__')]
class_variables

['long_description', 'name', 'short_description']
因此,这是一个“解决方案”。但是,对于我拥有的用例,我只能访问类实例,而不能访问类本身。那么,有没有一种方法可以通过类实例直接提取这些信息,而不必通过列表进行过滤


谢谢大家!

看起来仍然很粗糙,但是:

[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)

谢谢,很有帮助。尽管在示例中,如果类中定义了一个函数(不是像init那样以“_u”开头),这似乎也会在列表中返回该函数的名称。因此,这种方法存在一个问题,因为我希望返回的只是类变量。与其使用lambda的list+过滤器,不如使用list comp(在IMO中看起来更干净)
,而不是hasattr(v,'.\u call\u')
->
不可调用(v)
@agftrading更新了我的答案。现在它也排除了methods@agftrading没有具体的术语。这些都只是类变量。你对某些东西感兴趣。你可以说“类变量不包括方法”