有什么办法可以改变我的班级 list() 函数的工作方式吗?

New*_*ere 9 python class

我正在为我的学校作业写一个小班“AP”(“算术进步”)。我已经包含了一个使 AP 无限长的选项。

class AP:
    def __init__(self, first_term: float, co_diff: float, n: int = inf) -> None:
        self.a1 = first_term
        self.d = co_diff
        self.term = 0
        self.n = n

    def __repr__(self) -> str:
        return f'AP({self.a1}, {self.d}, {self.n})'

    def __str__(self) -> str:
        output_str = f"{', '.join([str(term) for term in list(self.terms(term=6))])}, ...."
        if self.n != inf:
            return output_str + f', {(self.a1 + ((self.n - 1) * self.d))}'
        return output_str

    def terms(self, term: int):
        return AP(self.a1, self.d, n=term)

    def __iter__(self):
        return self

    def __next__(self):
        self.term += 1
        if self.term < self.n:
            return (self.a1 + ((self.term - 1) * self.d))
        raise StopIteration

    def __eq__(self, o: object) -> bool:
        if isinstance(o, AP):
            return str(self) == str(o)
Run Code Online (Sandbox Code Playgroud)

但是当有人想把它转换成一个列表,如果它是一个无限的列表,我想提出一个错误,如:

 ValueError: The list() function was called for an object of undefined length.
Run Code Online (Sandbox Code Playgroud)

sum() 函数也是如此。有什么解决办法吗?

Ser*_*sta 3

AFAIK,Python 没有在源类中实现显式转换运算符的概念(C++ 有)。转换是目标类的责任,当前列表没有无限的规定。

一种可能的解决方法是使用本地函数隐藏: list

def list(it=()):
    import builtins

    if isinstance(it, AP) and it.n == inf:
        raise ValueError('The list() function was called for an object'
                         ' of undefined length.')
    return builtins.list(it)
Run Code Online (Sandbox Code Playgroud)

限制是,如果您使用sorted它也返回一个列表,则您的特殊函数将不会被使用。

如果您的类在特定模块中声明并从其他模块中使用,则另一个限制是必须在其他模块中导入特殊函数from APmod import list