我正试图编写我自己的“分数”类,它包含两个数字对象:分子和分母。但是,根据这两个参数的数据类型,我希望对象以不同的方式初始化。
例如,如果我声明x=Frac(2,5)
我希望x
保持Frac
类型。然而,如果我声明y=Frac(2.1,5)
我希望y
被转换为float
,值为0.42,而不是Frac(21,50)
。
这样做的正确方式是什么?
这感觉非常类似于具有单个对象的元组只返回原始对象的场景。这意味着x=(“cat”)
将x
设置为str
类型,而不是tuple
类型。
有两种选择。
x = Frac.create_by_type(2, 5)
y = Frac.create_by_type(2.1, 5)
实现实例:
class Frac:
...
@classmethod
def create_by_type(cls, a, b):
if isinstance(a, float):
return a / b
return cls(a, b)
如果您想直接使用Frac
构造函数,
class Frac:
def __new__(cls, a, b):
if isinstance(a, float):
return a / b
return super().__new__(cls)
def __init__(self, a, b):
self.a = a
self.b = b
f1 = Frac(2, 5)
f2 = Frac(2.1, 5)
print(type(f1))
print(type(f2))
print(f1.a, f1.b)
输出:
<class '__main__.Frac'>
<class 'float'>
2 5
但是重写\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu新的方法可能会很棘手,所以我不确定推荐它。