如何获取实例属性列表

时间:2016-12-16 09:17:00

标签: python python-2.7

是否有一个函数可以在没有单个对象的情况下获取类/ __init__属性的列表。我需要类属性的名称将它传递给一个函数。我试图寻找一个解决方案很多个小时,但大多数都需要使用类似x = ClassName()的东西 - 在我的情况下它会产生错误(例如__init__()需要6个参数(给定1个))。 例如:

class Car:
    def __init__(self, name, year, color):
         self.name = name
         self.year = year
         self.color = color

如何获得如下列表:

list_of_attr = ['name', 'year', 'color']

甚至可能吗?

编辑: 在我的问题中添加一些上下文 - 我正在尝试创建一个函数,它将从文本文件中获取数据并将其转换为对象列表。文件中的每一行包含一个对象的数据 - 在上面的例子中,它将是例如'沃尔沃,1995年,蓝&#39 ;. 我现在有两个类和两个文件(但期望更多),我已经创建了工作解决方案,但是现在我必须在预先编写的列表中将对象/实例属性的名称传递给我的函数。我希望它仅基于类名自动完成。

2 个答案:

答案 0 :(得分:3)

班上根本没有类属性。您的__init__方法设置实例属性,因此只有拥有实例且__init__实际运行后才能访问这些名称。

此时,您可以vars() function获取实例的命名空间;这会给你一本字典,所以你可以得到钥匙:

vars(x).keys()

如果您正在寻找__init__方法所需的参数,您可以使用inspect.getargspec()来检查签名。这将为您提供所有参数的名称,以及任何默认值的值(因此关键字参数)。从中你可以推断出必需(位置)参数的数量:

import inspect

argspec = inspect.getargspec(Car.__init__)
required = argspec.args
if argspec.defaults:
    required = required[:-len(argspec.defaults)]

这将包括为绑定方法自动传递的self参数;你可以用切片忽略第一个参数:

method_required = argspec.args[1:]
if argspec.defaults:
    method_required = method_required[:-len(argspec.defaults)]

演示:

>>> import inspect
>>> class Car:
...     def __init__(self, name, year, color):
...          self.name = name
...          self.year = year
...          self.color = color
...
>>> vars(Car('Volvo', 1975, 'blue'))
{'color': 'blue', 'name': 'Volvo', 'year': 1975}
>>> vars(Car('Volvo', 1975, 'blue')).keys()
['color', 'name', 'year']
>>> inspect.getargspec(Car.__init__)
ArgSpec(args=['self', 'name', 'year', 'color'], varargs=None, keywords=None, defaults=None)

答案 1 :(得分:1)

简而言之,这是不可能的。如果没有为它创建内存,你就无法得到memeber变量(意思是:你必须创建一个对象)有一种替代方法,但唯一的办法是你需要为__init__()方法设置默认值。看看这个

class Car:
    def __init__(self, name="default", year=1995, color="red"):
         self.name = name
         self.year = year
         self.color = color

members = [mems for mems in dir(Car()) if not callable(mems) and not mems.startswith("__")]
print members 

输出

['color', 'name', 'year']