是否有一个函数可以在没有单个对象的情况下获取类/ __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 ;. 我现在有两个类和两个文件(但期望更多),我已经创建了工作解决方案,但是现在我必须在预先编写的列表中将对象/实例属性的名称传递给我的函数。我希望它仅基于类名自动完成。
答案 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']