gpt4 book ai didi

python - 向类添加属性的更多 Pythonic 方式?

转载 作者:太空狗 更新时间:2023-10-29 18:31:20 27 4
gpt4 key购买 nike

我正在处理来自两个不同网页的数据集,但对于同一个人 - 数据集是合法信息。第一页上提供了一些数据,因此我使用适当的信息初始化被告对象,并将当前没有数据的属性设置为 null。这是类:

class Defendant(object):
"""holds data for each individual defendant"""
def __init__(self,full_name,first_name,last_name,type_of_appeal,county,case_number,date_of_filing,
race,sex,dc_number,hair_color,eye_color,height,weight,birth_date,initial_receipt_date,current_facility,current_custody,current_release_date,link_to_page):
self.full_name = full_name
self.first_name = first_name
self.last_name = last_name
self.type_of_appeal = type_of_appeal
self.county = county
self.case_number = case_number
self.date_of_filing = date_of_filing
self.race = 'null'
self.sex = 'null'
self.dc_number = 'null'
self.hair_color = 'null'
self.eye_color = 'null'
self.height = 'null'
self.weight = 'null'
self.birth_date = 'null'
self.initial_receipt_date = 'null'
self.current_facility = 'null'
self.current_custody = 'null'
self.current_release_date = 'null'
self.link_to_page = link_to_page

这就是当我将半填写的被告对象添加到被告列表时的样子:

list_of_defendants.append(Defendant(name_final,'null','null',type_of_appeal_final,county_parsed_final,case_number,date_of_filing,'null','null','null','null','null','null','null','null','null','null','null','null',link_to_page))

然后,当我从其他页面获取其余数据时,我会像这样更新那些设置为 null 的属性:

        for defendant in list_of_defendants:
defendant.sex = location_of_sex_on_page
defendant.first_name = location_of_first_name_on_page
## Etc.

我的问题是:当我只有一半的信息要存储在其中时,是否有更 pythonic 的方法来向类添加属性或初始化类对象的不那么丑陋的方法?

最佳答案

首先,为您设置为空的任何参数使用默认值。这样您甚至不需要在实例化对象时指定这些参数(并且您可以使用参数名称以任何顺序指定任何您确实需要的参数)。对于这些,您应该使用 Python 值 None 而不是字符串 "null" ,除非有某些特定原因需要使用该字符串。在 Python 2.x 中,具有默认值的参数需要放在最后,因此 link_to_page 需要移到这些参数之前。

然后,您可以通过更新实例的 __dict__ 属性来设置您的属性,该属性存储附加到实例的属性。每个参数都将设置为具有相同名称的实例的属性。

def __init__(self, full_name, first_name, last_name, type_of_appeal, county, case_number, 
date_of_filing, link_to_page, race=None, sex=None, dc_number=None,
hair_color=None, eye_color=None, height=None, weight=None, birth_date=None,
initial_receipt_date=None, current_facility=None, current_custody=None,
current_release_date=None):

# set all arguments as attributes of this instance
code = self.__init__.__func__.func_code
argnames = code.co_varnames[1:code.co_argcount]
locs = locals()
self.__dict__.update((name, locs[name]) for name in argnames)

您还可以考虑从其他两个名称参数合成 full_name。那么你就不用传入多余的信息,永远不会不匹配。您可以通过属性即时执行此操作:

@property
def full_name(self):
return self.first_name + " " + self.last_name

对于更新,我会添加一个方法来执行此操作,但使用 ** 接受仅包含关键字的参数。为了帮助保护数据的完整性,我们将仅更改已存在且设置为 None 的属性。

def update(self, **kwargs):
self.__dict__.update((k, kwargs[k]) for k in kwargs
if self.__dict__.get(k, False) is None)

然后您可以通过一次调用轻松更新所有您想要的:

defendant.update(eye_color="Brown", hair_color="Black", sex="Male")

要确保实例已完全填写,您可以添加一个方法或属性来检查以确保所有属性都不是None:

@property
def valid(self):
return all(self.__dict__[k] is not None for k in self.__dict__)

关于python - 向类添加属性的更多 Pythonic 方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36485907/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com