提问者:小点点

在Python中初始化的条件类型


我正试图编写我自己的“分数”类,它包含两个数字对象:分子和分母。但是,根据这两个参数的数据类型,我希望对象以不同的方式初始化。

例如,如果我声明x=Frac(2,5)我希望x保持Frac类型。然而,如果我声明y=Frac(2.1,5)我希望y被转换为float,值为0.42,而不是Frac(21,50)

这样做的正确方式是什么?

这感觉非常类似于具有单个对象的元组只返回原始对象的场景。这意味着x=(“cat”)x设置为str类型,而不是tuple类型。


共1个答案

匿名用户

有两种选择。

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新的方法可能会很棘手,所以我不确定推荐它。