我有一个带有一个必需参数和两个可选参数的 class,以及一个 returns 带有一个可选参数的 repr 方法,以给定的参数为准

I have a class with one required and two optional parameters, and a repr method which returns with one of the optional params, whichever is given

class MyClass():
    def __init__(self, name, high=None, low=None):
        self.name = name
        if low:
            self.low = low
        elif high:
            self.high = high
        else:
            raise Error("Not found")

    def __repr__(self):
        value = self.low or self.high
        return '{}({}, {})'.format(str(self), self.name, value)

我有一个单元测试用例,其中 MyClass 被实例化,

gain = MyClass('name', high='high_value')
assert isinstance(repr(gain), str)

但是当我的 repr() 被调用时,它抛出 AttributeError,

AttributeError: 'MyClass' has no attribute 'low'

我会将您的代码重构为以下内容

class MyClass:
    def __init__(self, name, high=None, low=None):
        self.name = name
        self.low = low
        self.high = high
        if self.low is None and self.high is None:
            raise Error("Not found")
        if self.low is not None and self.high is not None:
            raise Error("Only low OR high may be specified, not both")
        
    def __repr__(self):
        value = self.low if self.low is not None else self.high
        return '{}({}, {})'.format(str(self), self.name, value)

因此,在 __init__ 中,您的断言是 恰好设置了 low 或 high 之一,换句话说,没有设置或都没有设置是错误的。然后在 __repr__ 中,您可以根据传入的内容分配 value。在这种情况下,self.lowself.high 都将存在,尽管它们的值之一将是 None.