Skip to main content
 首页 » 编程设计

python之如何处理 python 对象创建过程中的错误

2025年05月04日24lyj

我正在尝试编写一个类来帮助我输出带分数。

这段代码很适合我的目的

class mixed_fraction(): 
    from fractions import Fraction 
    '''Returns mixed fractions in tuple format 
    (whole_part, numerator, denominator) 
    ''' 
    def __init__(self, numerator = 0, denominator = 1): 
        self.numerator = numerator 
        self.denominator = denominator 
    def mixed(self): 
        if self.denominator == 0: 
            return 'Denominator cannot be Zero' 
        quotient = int(self.numerator/self.denominator) 
        remain = self.numerator - (self.denominator * quotient) 
        frac = Fraction(remain, self.denominator) 
        return (quotient, frac.numerator, frac.denominator) 

示例输入

print(mixed_fraction(3, 2).mixed()) 
print(mixed_fraction(1, 5).mixed()) 
print(mixed_fraction(1, 0).mixed()) 
print(mixed_fraction().mixed()) 
print(mixed_fraction(7, 2).mixed()) 
print(mixed_fraction(769, 17).mixed()) 
print(mixed_fraction(384, 256).mixed()) 

输出

(1, 1, 2) 
(0, 1, 5) 
Denominator cannot be Zero 
(0, 0, 1) 
(3, 1, 2) 
(45, 4, 17) 
(1, 1, 2) 

但我希望能够在创建对象时指出零错误,因为首先创建一个零除数的分数是没有意义的。所以我需要帮助来及时发现错误。

class mixed_fraction(): 
    from fractions import Fraction 
    '''Returns mixed fractions in tuple format 
    (whole_part, numerator, denominator) 
    ''' 
    def __init__(self, numerator = 0, denominator = 1): 
        self.numerator = numerator 
        self.denominator = denominator 
        if denominator == 0: 
            return 'Denominator cannot be Zero' 
    def mixed(self): 
        quotient = int(self.numerator/self.denominator) 
        remain = self.numerator - (self.denominator * quotient) 
        frac = Fraction(remain, self.denominator) 
        return (quotient, frac.numerator, frac.denominator) 

问题是 __init__ 必须返回 None。所以我不知道如何解决这个问题

请您参考如下方法:

当您想在 Python 中生成错误时,您不会返回值:您会引发错误。

在这种情况下,最合适的是 ZeroDivisionError:

def __init__(self, numerator = 0, denominator = 1): 
    self.numerator = numerator 
    self.denominator = denominator 
    if denominator == 0: 
        raise ZeroDivisionError('Denominator cannot be Zero!') 

ZeroDivisionError 本身是“ArithmeticError”的特化 - 但您可以通过对其进行子类化来根据您的目的进一步定制错误:

class ZeroDenominatorError(ZeroDivisionError):  
    pass 

它的主要优点是程序流程可以层层下降 没有使用 try...except block 正确处理错误的代码 - 直到你捕获它的地方 - 否则你必须放置一个 if 语句在您实例化类的所有地方检查返回值的类型。

所以 - 这是处理它的正确方法。现在,根据设计,可能希望类的实例化失败并返回另一个值(“无”比错误消息更好 - 有错误,只需引发异常)。在这种情况下,您应该编写 __new__ 方法而不是 __init__。与 __init__ 不同,它必须返回新创建的实例。 (而且它还必须通过正确调用父类(super class)的 __new__ 方法来创建那个新实例):

from fractions import Fraction 
 
class MixedFraction(Fraction): 
    def __new__(cls, numerator=0, denominator=1): 
        if not denominator: 
            return None 
        instance = super().__new__(cls, numerator, denominator) 
        return instance 
    def mixed(self): 
        quotient = self.numerator // self.denominator 
        remain = self.numerator - (self.denominator * quotient) 
        return (quotient, remain, self.denominator) 

至于 Hilliad 在他的回答中的建议,这直接继承自“Fraction”——这意味着它可以在任何使用 Fraction 的地方使用,但它有额外的“混合”方法。请注意,如果您无论如何都在操作分子和分母参数,那么从 Fraction 继承将需要您编写 __new__ 而不是 __init__:它们是在实例化时在对象中设置的, 在 native (C) 代码中,不能进一步更改。