你没有。
你想要的行为完全出乎意料,而且有些奇怪。调用A() 预计会返回A 的实例。做任何其他事情都是令人困惑和不直观的,这使得阅读和理解任何调用它的代码都很困难。
另类
如果你真的需要这种行为,创建一个工厂方法:
def make_thing(a, b):
if 0 == b:
return int(a)
else:
return A(a, b)
显然,你需要一个比make_thing 更好的名字,但是没有任何上下文,我无法给你任何建议。
尽可能避免这个问题
由于A 不是数字并且通常与int 不兼容,因此将int 和A 存储在同一个变量中也有些奇怪。
如果您所做的只是转换为字符串,那么您根本不需要类。类之外的简单方法是更好的选择:
def a_and_b_to_string(a, b):
if b == 0:
return str(int(a))
else:
return str(a) + ":" + str(b)
如果你做的不止这些,你的调用代码最终可能会是这样的:
x = make_thing(input1, input2)
if isinstance(x, A):
result = x.some_method_from_a() # Or some other calculation requiring an A
else:
result = 5 * x # Or some other calculation requiring an `int`
这有点愚蠢:您编写一个方法来选择数据类型,然后必须为每个可能的结果编写专门的代码。您没有从这里返回单独类型的函数中获得任何好处。我可以想到两个更简单的选择:
-
只需将检查移至调用代码即可:
if input2 == 0:
temp = A(input1, input2)
result = temp.some_method_from_a() # Or some other calculation requiring an A
else:
result = 5 * int(input1) # Or some other calculation requiring an int
如果你走这条路,你还应该修改A.__init__,如果b == 0,则抛出ValueError,因为这对于A来说是无效的状态。
-
修改A,使其无论b是否为0都能正常工作:
class A(object):
def __init__(self,a,b):
self.a = a
self.b = b
def some_method_from_a():
if self.b == 0:
# Some calculation involving only a
return int(self.a) * 5
else:
# Some other more complex calculation involving both a and b
return self.a * self.b * 6
def __repr__(self):
if self.b == 0:
return str(int(self.a))
else:
return str(self.a) + ":" + str(self.b)
然后
x = A(a, b)
result = x.some_method_from_a()
但是,在不知道您实际使用它的情况下很难提供建议。