为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUX布斯 2021-05-03 18:15:44
此代码未按我希望的方式运行:class A():            def __init__(self,b,c):        self.b = 1        self.c = 2def get_dict(self):    mydict={}            for att in A():        mydict[att]=self.att    return mydictprint(get_dict(s))
查看完整描述

3 回答

?
慕婉清6462132

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}


查看完整回答
反对 回复 2021-05-11
?
达令说

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}


查看完整回答
反对 回复 2021-05-11
?
千万里不及你

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,因此我根本不必编写任何东西。


查看完整回答
反对 回复 2021-05-11
  • 3 回答
  • 0 关注
  • 177 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信