【问题标题】:How do I retrieve a list of class variables from an instance of that class in python?如何从 python 中该类的实例中检索类变量列表?
【发布时间】:2021-03-16 22:10:50
【问题描述】:

举个例子,下面这个类:

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.x class variables


    【解决方案1】:

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

    [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 那样以 '__' 开头),这似乎也会在列表中返回该函数的名称。所以这种方法存在问题,因为它只是我想要返回的类变量。
    • 不要使用带有 lambda 的 list+filter,而是使用 list comp(看起来更干净的 IMO)
    • and not hasattr(v, '__call__') -> not callable(v)
    • @agftrade 更新了我的答案。现在它也排除了方法
    • @agftrading 没有具体的术语。这些都只是类变量。你对特定的感兴趣。你可以说“类变量不包括方法”
    猜你喜欢
    • 2022-08-11
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 2019-12-30
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多