您可以通過在您的實例上調用dir
來獲取所需的名稱。然而,由dir
返回的列表也有一堆名稱,你不要想要(從object
繼承的方法的名稱),所以我們需要過濾掉。
class TestClass(object):
def __init__(self):
self.name = 'Marty'
self.age = 25
self.place = 'CL'
@property
def country(self):
return 'USA'
@property
def age_group(self):
return '18-25'
x = TestClass()
d = {k: getattr(x, k) for k in dir(x) if not k.startswith('__')}
print(d)
輸出
{'age': 25, 'age_group': '18-25', 'country': 'USA', 'name': 'Marty', 'place': 'CL'}
這裏是要做到這一點更清潔的方式。我們遍歷類對象的vars()
,特別是查找實例爲property
的項目。然後我們使用itertools.chain
將這些名稱與在類的實例上調用vars()
的名稱組合起來。
from itertools import chain
class TestClass(object):
def __init__(self):
self.name = 'Marty'
self.age = 25
self.place = 'CL'
@property
def country(self):
return 'USA'
@property
def age_group(self):
return '18-25'
def do_stuff(self):
return 'hello'
def attributes_and_properties(obj):
props = (k for k, ktype in vars(type(obj)).items()
if isinstance(ktype, property))
return {k: getattr(obj, k) for k in chain(props, vars(obj))}
x = TestClass()
print(attributes_and_properties(x))
輸出
{'country': 'USA', 'age_group': '18-25', 'name': 'Marty', 'age': 25, 'place': 'CL'}
這種方法優於以前的技術,因爲這些代碼也將包括綁定方法,其名稱不與__
開始,像do_stuff
,在它的輸出。
您可以訪問TestClass .__ dict__上的屬性。所以我想你可以遍歷這些並添加名稱,如果'type == property' –