在 Python 中初始化的条件类型

Conditional types initialized in Python

我正在尝试编写自己的 "fraction" class,它接受两个数字对象:分子和分母。但是,根据两个参数的数据类型,我希望对象以不同的方式初始化。

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

处理此类事情的正确方法是什么?

这感觉与具有单个对象的元组只是 returns 原始对象的场景非常相似。这意味着 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构造函数,

2。覆盖 Frac.__new__ 方法

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

但是覆盖 __new__ 方法可能很棘手,所以我不确定是否推荐它。