Return class 实例化时的不同类型?
Return different type upon class instantiation?
所以我正在制作我自己的 Complex class 版本,它用作虚数的表示: Complex(a, b) 其中 a + bi。
事实是,我想 return 根据给定的论点做些别的事情。我很确定我必须使用魔术方法 new 但我似乎无法处理给定的参数。例如:
a = Complex(4, 5)
print(a)
> Complex(4, 5)
b = Complex(3, 0)
print(b)
> 3
c = Complex(0, 0)
print(c)
> 0
我希望为 b 和 c 变量分配数值。不是某种 class 伪装成它不是的东西的字符串解决方案。我该怎么做?
感谢回复:))
Not some sort of to-string solution where the class pretends to be
something it is not.
不过,这不正是您使用 __str__
的目的吗?也许我没有正确理解你,但如果你担心你无法对你的对象进行数学运算,你只需实施相关的魔术方法,例如 __add__
.
正如其他人在评论中指出的那样,这正是 __new__
的目的。
创建 class Complex
的实例时会发生以下情况:
- 你写
Complex(a, b)
.
Complex.__new__(a, b)
被调用,默认情况下(也就是说,如果你不重写 __new__
方法)这个 return 是一个 [=12= 类型的空对象].
- 如果由
Complex.__new__(a, b)
编辑的对象 return(我们将其表示为 cmplx
)实际上是 Complex
类型,则调用 cmplx.__init__(a, b)
,或等价地, Complex.__init__(cmplx, a, b)
.
对于你的情况,当调用第二个参数时,只需在 __new__
方法中 return 一个 int
,然后调用超级 [=] 的 __new__
方法39=] 否则。即:
class Complex:
def __new__(cls, a, b):
if b == 0:
return a
return super().__new__(cls) # or equiv.: object.__new__(cls)
如前所述,new
比其他解决方案容易得多,因为所有内容都组合在一起。您可以只说如果第二个参数为零,则 return a
否则再次调用 __new__
。
我认为这可能正是您所需要的,因为您指出您在寻找解决方案时遇到了困难。
所以我正在制作我自己的 Complex class 版本,它用作虚数的表示: Complex(a, b) 其中 a + bi。
事实是,我想 return 根据给定的论点做些别的事情。我很确定我必须使用魔术方法 new 但我似乎无法处理给定的参数。例如:
a = Complex(4, 5)
print(a)
> Complex(4, 5)
b = Complex(3, 0)
print(b)
> 3
c = Complex(0, 0)
print(c)
> 0
我希望为 b 和 c 变量分配数值。不是某种 class 伪装成它不是的东西的字符串解决方案。我该怎么做?
感谢回复:))
Not some sort of to-string solution where the class pretends to be something it is not.
不过,这不正是您使用 __str__
的目的吗?也许我没有正确理解你,但如果你担心你无法对你的对象进行数学运算,你只需实施相关的魔术方法,例如 __add__
.
正如其他人在评论中指出的那样,这正是 __new__
的目的。
创建 class Complex
的实例时会发生以下情况:
- 你写
Complex(a, b)
. Complex.__new__(a, b)
被调用,默认情况下(也就是说,如果你不重写__new__
方法)这个 return 是一个 [=12= 类型的空对象].- 如果由
Complex.__new__(a, b)
编辑的对象 return(我们将其表示为cmplx
)实际上是Complex
类型,则调用cmplx.__init__(a, b)
,或等价地,Complex.__init__(cmplx, a, b)
.
对于你的情况,当调用第二个参数时,只需在 __new__
方法中 return 一个 int
,然后调用超级 [=] 的 __new__
方法39=] 否则。即:
class Complex:
def __new__(cls, a, b):
if b == 0:
return a
return super().__new__(cls) # or equiv.: object.__new__(cls)
如前所述,new
比其他解决方案容易得多,因为所有内容都组合在一起。您可以只说如果第二个参数为零,则 return a
否则再次调用 __new__
。
我认为这可能正是您所需要的,因为您指出您在寻找解决方案时遇到了困难。