从python对象中提取特定字段

2024-09-22 20:19:20 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我正在使用的一个示例python对象。你知道吗

class DataObj(object):

   def __init__(self, cvid, cvname, address, get_info):
      self.cvid = cvid
      self.cvname = cvname
      self.address = address
      self.prof = PROF("Honda", "Jason Jones")


class PROF(object):

    def __init__(self, organization, manager_name):
        self.organization = organization
        self.manager_name = manager_name
        self.project_list = [Proj("asd", "asd"), Proj("asdsd", "asdsd")]
class Proj(object):
     def __init__(self, projectname, projecttype):
         self.projectname = projectname
         self.projecttype = projecttype

我需要编写一个函数,获取字段列表,并从DataObj中提取所有字段作为键值对。诀窍是它还应该查找DataObj类中组成的对象的属性。例如,如果字段列表是[“cvid”,“organization”,“projectname”],它应该以如下格式返回类似的内容

{'cvid' : 'value', 'organization' : 'Honda', Proj :[{'projectname' : 'asd'}, {'projectname' : 'asdsd'}]

我应该在哪里写这个函数,这样我的代码就更模块化了?我想把它写在DataObj中,但我不知道DataObj中组成的object的属性是什么。如何以更面向对象的方式实现我要做的事情?你知道吗


Tags: nameselfobjectinitaddressdefmanagerclass
2条回答

__getattr__operator.attrgetter之间,您可以很容易地完成这项工作:

class DataObj(object):

    def __init__(self, cvid, cvname, address, get_info):
        self.cvid = cvid
        self.cvname = cvname
        self.address = address
        self.prof = PROF("Honda", "Jason Jones")

    def __getattr__(self, name):
        # Called when an attribute is accessed which is not found on DataObj
        # You can limit the loop to avoid checking some attributes, or
        # remove the loop if only self.prof should be checked
        for member in (self.cvid, self.cvname, self.address, self.prof):
            try:
                return getattr(member, name)
            except AttributeError:
                pass
        raise AttributeError(name)

        # If only self.prof should be checked, the function could simplify to:
        # return getattr(self.prof, name)

然后,您可以创建一个简单的实用程序函数,该函数针对DataObj运行,以从中获取任意一组键值对:

from operator import attrgetter

def extractdata(dataobj, *names):
    return dict(zip(names, attrgetter(*names)(dataobj)))

或者作为DataObj的成员,只需命名第一个与约定匹配的参数self

def extractdata(self, *names):
    return dict(zip(names, attrgetter(*names)(self)))

__getattr__允许将属性查找委托给包含的对象,attrgetter允许您以简单的方式检索一组任意属性。你知道吗

我所做的只是简单地添加__iter__,它基本上是说嘿,如果您将对象强制转换为iterabale容器类型,您可以对我进行迭代。你知道吗

class Proj(object):
    def __init__(self, projectname, projecttype):
        self.projectname = projectname
        self.projecttype = projecttype

    def __iter__(self):
        yield ("projectname", self.projectname)


class PROF(object):
    def __init__(self, organization, manager_name):
        self.organization = organization
        self.manager_name = manager_name
        self.project_list = [Proj("asd", "asd"), Proj("asdsd", "asdsd")]

    def __iter__(self):
        for proj in self.project_list:
            yield (dict(proj))


class DataObj(object):
    def __init__(self, cvid, cvname, address):
        self.cvid = cvid
        self.cvname = cvname
        self.address = address
        self.prof = PROF("Honda", "Jason Jones")

    def __iter__(self):
        yield ('cvid', self.cvid)
        yield ('organization', self.prof.organization)
        yield ("Proj", list(self.prof))


do = DataObj("1", "heinst", "A Street, Somewhere, USA")
print dict(do)

相关问题 更多 >