假设我想要组合两个对象,并且我希望能够定义多个遵守默认参数的构造函数
class A:
def __init__(x,y=0):
self.x = x
self.y = y
class B:
def __init__(w,objA, z=1):
self.w = w
self.objA = objA
self.z = z
我想为B
提供多个构造函数,这些构造函数允许我传递对象A
或传递参数,然后构造A
。看着What is a clean, pythonic way to have multiple constructors in Python?我能做到:
class B:
def __init__(w, objA, z=1):
self.w = w
self.objA = objA
self.z=z
@classmethod
def from_values(cls,w,z,x,y):
objA = A(x,y)
return cls(w,objA,z)
问题是默认值被覆盖,我想保留它们。下面的方法当然不起作用
@classmethod
def from_values(cls,w,x,**kwargs):
objA = A(x,**kwargs)
return cls(w,objA,**kwargs)
所以我似乎一直在记默认值,并这样调用它们
@classmethod
def from_values(cls,w,x,z=1,y=0):
objA = A(x,y)
return cls(w,objA,z)
这不是我想要的,因为我宁愿让对象本身处理默认值,而不是被迫记住默认值。我可以做一个比上面更好的并使用:
@classmethod
def from_values(cls,w,x,z=1,**kwargs):
objA = A(x,**kwargs)
return cls(w,objA,z)
但在这种情况下,我仍然需要“记住”z
的默认值。有没有一个解决这个问题的方法?这是设计问题吗?有人能告诉我一个好的设计模式或最佳实践吗?当与多个对象组合时,这个问题就复杂了
class L:
def __init__(objM,objN):
self.objM = objM
self.objN = objN
@classmethod
def from_values(cls, m1,m2,m3,n1,n2):
objM = M(m1,m2,m3)
objN = N(n1,n2)
return cls(objM, objN)
首先,我认为这不是你想做的。随着这种扩展,尝试调用构造函数将变得乏味且容易出错
你可以用显式词典解决我们的两个问题
它可能没有你想要的那么聪明或整洁,但是它确实允许你从一个
A
构造,如果你已经有了它,或者以一种更结构化的方式传递一组可配置的参数相关问题 更多 >
编程相关推荐