如何在我的子类中重新定义append方法?

2024-05-16 03:07:55 发布

您现在位置:Python中文网/ 问答频道 /正文

实现LoggableList类,从listLoggable类继承该类,以便在使用append方法向列表添加项时,只向包含所添加项的日志发送消息。 如何在类LoggableList中重新定义append方法,以便在LoggableList类的append方法中调用Loggable类的log方法

下面是我尝试编写的代码:

import time

class Loggable:

    def log(self, msg):
        print(str(time.ctime()) + ": " + str(msg))
        return


class LoggableList(Loggable, list):

    def __init__(self, data):
        super().__init__()
        self.data = list(input('Please input your massage: '))

    def append(self, element):
        super(LoggableList, self).append(element)
        Loggable.log()
        return

Tags: 方法selflogdatareturntimeinitdef
2条回答

建议使用collections模块中提供的抽象基类作为内置容器类型的子类:

对于list,您应该使用^{};它允许您重写其他方法可能很困难的特殊方法。(参见下文所示的__setitem__覆盖)

在这种情况下,您不需要提供构造函数;在调用超类的append方法之前,重写append方法以包括对self.log(elt)的调用

import time
from collections import UserList

class Loggable:
    def log(self, msg):
        print(f'{str(time.ctime())}: {msg}')

        
class LoggableList(UserList, Loggable):
    """A list that documents its successive transformations 
    """

    def append(self, elt):
        self.log(f'append({elt})')
        super().append(elt)
    
    def __setitem__(self, idx, elt):
        self.log(f'set[{idx}] {elt}')
        self.data[idx] = elt
    
        
log_list = LoggableList([1, 2, 3])
log_list.append(4)
log_list[2] = 0
log_list[3] = 'abc'
log_list.append(None)
print(log_list)

输出

Fri Nov 13 23:33:33 2020: append(4)
Fri Nov 13 23:33:33 2020: set[2] 0
Fri Nov 13 23:33:33 2020: set[3] abc
Fri Nov 13 23:33:33 2020: append(None)
[1, 2, 0, 'abc', None]
  1. 您可以使用super的缩短版本:

    super().append(element)
    
  2. self.log(),而不是Loggable.log()

  3. 您忘记提供参数msg

  4. 与其在Loggable.log中多次调用str,只需使用.format(如果使用Python>;=3.6,则使用f-string):

    print('{}: {}'.format(time.ctime(), msg))
    

相关问题 更多 >