PYTHON_bai_xvan 2024-04-20 11:28 采纳率: 80%
浏览 1
已结题

python __add__

python 自定义类实现__add__方法后被视为列表?
导致用不了自定义方法?
源码:

from typing import NoReturn

class LimitQueueInitMaxDataValueError(Exception):
def init(self, data: int | float | str):
self.data = data

def __str__(self):
    return f"{self.data} is not int"

def max_data_error(data: int | float | str) -> NoReturn:
raise LimitQueueInitMaxDataValueError(data)

class LimitQueue:

def __init__(self, data: list | tuple, max_data: int):
    if type(max_data) is int:
        self.list_ = list(data)
        self.max_data = int(max_data)
    else:
        max_data_error(max_data)

def __repr__(self):
    return str(self.list_)

def __str__(self):
    return str(self.list_)

def __add__(self, other: list | tuple):
    return self.list_ + other

def __radd__(self, other: list | tuple):
    return other + self.list_

def __iadd__(self, other: list | tuple):
    self.list_.extend(other)
    self._del_max("<")
    return self.list_

def _del_max(self, exit_class_str: str):
    if len(self.list_) > self.max_data:
        if exit_class_str == "<":
            while len(self.list_) > self.max_data:
                del self.list_[0]
        elif exit_class_str == ">":
            while len(self.list_) > self.max_data:
                del self.list_[-1]

def set_max_data(self, new_data: int):
    if type(new_data) is int:
        self.max_data = int(new_data)
        self._del_max(">")
    else:
        max_data_error(new_data)

lq1 = LimitQueue([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], max_data=10)

print(type(lq1)) # 输出:<class 'list'> ?
lq1.set_max_data(100) #报错?

  • 写回答

6条回答 默认 最新

  • 关注

    上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    对于代码中提到的问题,出现 <class 'list'> 可能是因为 __add__ 方法的实现,将 LimitQueue 对象和 list 对象进行了相加。而报错 AttributeError: 'list' object has no attribute 'set_max_data' 则是因为此时 lq1 被视为 list 对象,因此无法调用 LimitQueue 类的方法。

    解决方案:

    1. __add__ 方法中,返回一个新的 LimitQueue 对象,而不是返回一个 list 对象。
    def __add__(self, other: list | tuple):
        return LimitQueue(self.list_ + other, self.max_data)
    
    1. __radd__ 方法中同样需要返回一个新的 LimitQueue 对象。
    def __radd__(self, other: list | tuple):
        return LimitQueue(other + self.list_, self.max_data)
    
    1. 修改 __iadd__ 方法的实现,使其返回当前 LimitQueue 对象。
    def __iadd__(self, other: list | tuple):
        self.list_.extend(other)
        self._del_max("<")
        return self
    
    1. set_max_data 方法中,同样需要返回当前 LimitQueue 对象。
    def set_max_data(self, new_data: int):
        if type(new_data) is int:
            self.max_data = int(new_data)
            self._del_max(">")
        else:
            max_data_error(new_data)
        return self
    

    修改后的代码如下:

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 4月28日
  • 已采纳回答 4月20日
  • 创建了问题 4月20日

悬赏问题

  • ¥15 为啥画版图在Run DRC会出现Connect Error?可我Calibre的hostname和计算机的hostname已经设置成一样的了。
  • ¥20 网站后台使用极速模式非常的卡
  • ¥20 Keil uVision5创建project没反应
  • ¥15 mmseqs内存报错
  • ¥15 vika文档如何与obsidian同步
  • ¥15 华为手机相册里面的照片能够替换成自己想要的照片吗?
  • ¥15 陆空双模式无人机飞控设置
  • ¥15 sentaurus lithography
  • ¥100 求抖音ck号 或者提ck教程
  • ¥15 关于#linux#的问题:子进程1等待子进程A、B退出后退出(语言-c语言)