代码之家  ›  专栏  ›  技术社区  ›  agftrading

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

  •  0
  • agftrading  · 技术社区  · 3 年前

    例如,以下是一个类:

    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)
    

    我想检索一个类变量列表,不包括任何类实例变量。也就是说,列表将是[“名称”、“短描述”、“长描述”]。

    我该怎么做?

    我意识到我可以部署它来提取类的信息:

    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']
    

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

    非常感谢。

    0 回复  |  直到 3 年前
        1
  •  1
  •   Vladimir    3 年前

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

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