猿问

我们如何从课堂上获得字典,

此代码未按我希望的方式运行:


class A():        

    def __init__(self,b,c):


        self.b = 1

        self.c = 2


def get_dict(self):


    mydict={}        

    for att in A():

        mydict[att]=self.att

    return mydict


print(get_dict(s))


HUX布斯
浏览 178回答 3
3回答

慕婉清6462132

您的意思是:class A():            def __init__(self):        self.b = 1        self.c = 2def get_dict(self):    mydict={}            for att in [i for i in dir(A()) if not i.startswith('__')]:        mydict[att]=getattr(self,att)    return mydictprint(get_dict(A()))输出:{'b': 1, 'c': 2}

达令说

您可以使用该__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}

千万里不及你

这个问题有点模棱两可。如果您要为简单类的实例请求简单属性,这正是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()>>> aA(b=1, c=2)>>> print(dataclasses.asdict(a)){'b': 1, 'c': 2}该dataclasses库__init__为我构建了方法,还为__repr__方法构建了方法,以及支持诸如之类的东西所需的其他内容asdict,因此我根本不必编写任何东西。
随时随地看视频慕课网APP

相关分类

Python
我要回答