gpt4 book ai didi

python - 向构造函数传递太多参数是否被视为反模式?

转载 作者:太空狗 更新时间:2023-10-29 22:09:13 25 4
gpt4 key购买 nike

我正在考虑使用 factory_boy 库进行 API 测试。文档中的一个示例是:

class UserFactory(factory.Factory):
class Meta:
model = base.User

first_name = "John"
last_name = "Doe"

为此,我们需要将 first_namelast_name 等作为参数传递给 __init__() 方法 base.User() 类。然而,如果你有很多参数,这会导致类似这样的结果:

class User(object):

GENDER_MALE = 'mr'
GENDER_FEMALE = 'ms'

def __init__(self, title=None, first_name=None, last_name=None, is_guest=None,
company_name=None, mobile=None, landline=None, email=None, password=None,
fax=None, wants_sms_notification=None, wants_email_notification=None,
wants_newsletter=None, street_address=None):

self. title = title
self.first_name = first_name
self.last_name = last_name
self.company_name = company_name
self.mobile = mobile
self.landline = landline
self.email = email
self.password = password
self.fax = fax
self.is_guest = is_guest
self.wants_sms_notification = wants_sms_notification
self.wants_email_notification = wants_email_notification
self.wants_newsletter = wants_newsletter
self.company_name = company_name
self.street_address = street_address

现在的问题是,这种构造是否被视为反模式,如果是,我有哪些替代方案?

谢谢

最佳答案

在 Python 3.7 中,dataclasses (在 PEP557 中指定)已添加。这允许您只在构造函数中写入这些参数一次,而不是再次写入,因为构造函数是为您设计的:

from dataclasses import dataclass

@dataclass
class User:
title: str = None
first_name: str = None
last_name: str = None
company_name: str = None
mobile: str = None
landline: str = None
email: str = None
password: str = None
fax: str = None
is_guest: bool = True
wants_sms_notification: bool = False
wants_email_notification: bool = False
wants_newsletter: bool = False
street_address: str = None

它还向类添加了一个 __repr__ 以及其他一些。请注意,在 Python 3 中不再需要从 object 显式继承,因为默认情况下所有类都是新样式类。

不过,也有一些缺点。它在类定义上稍慢(因为需要生成这些方法)。您需要设置默认值或添加 type annotation ,否则会出现名称错误。如果你想使用可变对象,比如列表,作为默认参数,你需要使用 dataclass.field(default_factory=list) (通常不鼓励这样写,例如 def f (x=[]),但这里实际上引发了异常)。

这在您必须在构造函数中拥有所有这些参数的情况下很有用,因为它们都属于同一个对象并且不能提取到子对象,例如。

关于python - 向构造函数传递太多参数是否被视为反模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30599478/

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