我正在尝试创建一个可以用互斥参数实例化的类。例如。我们的课程采用完整的URL或逐段创建它:
def url('protocol','hostname','uri','port', 'url')
但是如果我们提供完整的'url',则不需要'protocol','hostname','uri','port'可以用可选参数来完成,然后检查什么不为空,但这确实很la脚:
def url('protocol'= None,'hostname' = None,'uri'= None,'port' = None, 'url'= None)
我也不认为是
def url(*args)
因为我们将必须创建一个解析器来查看我们正在传递的内容。
如何创建具有互斥参数的方法?
在类中做到这一点的一种方法是使用类方法从不同的参数集构造对象。
class Url:
def __init__(self, full_url):
self.url = full_url
@classmethod
def from_url(cls, full_url):
return cls(full_url)
@classmethod
def from_parts(cls, protocol, hostname, uri, port):
# Join the parameters and construct object
full_url = f"{protocol}://{hostname}:{port}"
return cls(full_url)
用法:
my_url = Url.from_url("http://google.com")
my_url = Url.from_parts("https", "google.com", "", "8080")
使用此模式,该功能的目的总是很清楚,并且对于传递的参数也没有歧义,并且调用者没有隐藏任何排他性模式。