在 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__
方法可能很棘手,所以我不确定是否推荐它。
我正在尝试编写自己的 "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__
方法可能很棘手,所以我不确定是否推荐它。