我想得到一个类的所有实例变量的列表,而不用创建该类的实例。我觉得这在Python中是不可能的。
假设我有这门课程:
class Person(object):
def __init__(self, fullname, age):
self.firstname, self.lastname = fullname.split(' ')
self.age = age
我想从中得到的是列表['lastname', 'age', 'firstname']
。
我能够获得此功能的唯一方法是使用Person
的临时实例:
temp = Person('Bob Jones', 27)
print vars(temp) # {'lastname': 'Jones', 'age': 27, 'firstname': 'Bob'}
print vars(temp).keys() # ['lastname', 'age', 'firstname']
这里的问题是,因为fullname.split()
被调用,如果我尝试使用Person(None, None)
创建一个空实例,则会引发错误。我不允许更改__init__
以允许此操作。
我的第一个想法是使用vars(Person).keys()
,但这会提供Person
类型的所有属性,而不是Person
的实例所具有的属性:
print vars(Person).keys()
# ['__module__', '__dict__', '__weakref__', '__doc__', '__init__']
有没有一种方法可以在不使用temp
的情况下修改类?
答案 0 :(得分:0)
Python在执行__init__
方法之前不知道将定义哪些属性。为了执行该方法,您必须创建该类的实例。哦,好吧:(
答案 1 :(得分:0)
这取决于你想知道多严重。例如,您可以fork / exec一个新的程序实例,实例化该类,分析实例,并返回结果。
您可以创建一个对象,该对象使用某些__magic_methods__()
来检测其方法的调用(如.split()
),然后尝试猜测适当的输入类型。 ..
但你可以打电话来知道实例数据的起始列表是什么吗?否。