3 回答
TA贡献1804条经验 获得超2个赞
您的意思是:
class A():
def __init__(self):
self.b = 1
self.c = 2
def get_dict(self):
mydict={}
for att in [i for i in dir(A()) if not i.startswith('__')]:
mydict[att]=getattr(self,att)
return mydict
print(get_dict(A()))
输出:
{'b': 1, 'c': 2}
TA贡献1821条经验 获得超6个赞
您可以使用该__dict__属性来获取对象的所有属性的字典。
class A():
def __init__(self,b,c):
self.b = b
self.c = c
def get_dict(self):
return self.__dict__
print(A(1, 2).get_dict())
输出:
{'b': 1, 'c': 2}
TA贡献1784条经验 获得超9个赞
这个问题有点模棱两可。
如果您要为简单类的实例请求简单属性,这正是vars内置函数的目的:
def get_dict(self):
return vars(self)
当我们在使用它时,self当您不编写方法时调用参数是很奇怪的。让我们称之为不同的东西:
def get_dict(obj):
return vars(obj)
但是很多事情是无法解决的,包括:
特性。
__slots__
类的任何属性。类属性。
__getattr__
/__getattribute__
和中的动态属性__dir__
。
如果您想要尽可能多的功能,那就是dir
内置功能。但是dir
只返回一个名称列表;然后,您必须逐一查找:
def get_dict(obj):
return {name: getattr(obj, name) for name in dir(obj)}
这非常接近“whatever我可以做的每件事obj.whatever”。
但是,这可能更多的比你想要的。它将包括私有成员,绑定方法以及Python解释器使用的特殊内容。您必须确定要过滤掉的内容,但是一旦有了规则,就应该易于实现。例如:
def get_dict(obj):
public = ((name, getattr(obj, name)) for name in dir(obj) if not name.startswith('_'))
noncallablepublic = {name: value for name, value in everything if not callable(value)}
return noncallablepublic
如果您想变得更高级,请查看该inspect模块,该模块具有用于此类过滤的辅助功能。
在此过程中,如果您有充分的理由对某些特定的类集执行此操作,则可能需要设计这些类,以使其更易于转换为字典,并能够自定义其转换方式。 。
例如,如果您使用@dataclass或第三方attrs库(更强大且不需要Python 3.7)来构建类,那么这很简单:
>>> @dataclasses.dataclass
... class A:
... b: int = 1
... c: int = 2
>>> a = A()
>>> a
A(b=1, c=2)
>>> print(dataclasses.asdict(a))
{'b': 1, 'c': 2}
该dataclasses库__init__为我构建了方法,还为__repr__方法构建了方法,以及支持诸如之类的东西所需的其他内容asdict,因此我根本不必编写任何东西。
添加回答
举报