如何使用父类的方法?

2024-09-28 17:03:43 发布

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

这里的SMS_Store继承了Message,但是每次调用父方法时都会出现错误:

NoneType object does not have attribute 'read_message'。你知道吗

而且存储在列表中的对象也返回一个None值??你知道吗

class Message():

    def __init__(self, from_number, time_arrived, text_of_sms):
        self.has_been_viewed=False
        self.from_number= from_number
        self.time_arrived = time_arrived
        self.text_of_sms = text_of_sms

    def getTime(self):
        return self.time_arrived

    def getText(self):
        return self.text_of_sms

    def setView(self):
        self.has_been_viewed = True

    def check_read(self):
        return self.has_been_viewed


class SMS_Store(Message):

    def __init__(self):
        self.list_=[]

    def add_new_arrivals(self,from_number, time_arrived, text_of_sms):
        self.list_.append(Message.__init__(self,from_number,time_arrived,text_of_sms))

    def message_count(self):
        return len(self.list_)

    def get_unread_index(self):
        unread =[]
        for i in range(len(self.list_)):
            if(super(SMS_Store,self).check_read() == False):
                unread.append(i)
        return unread

    def read_message(self,index):
        self.list_[index].getText()

    def delete(self,ints):
        a = int(ints)
        self.list_.pop(a)

    def clear():
        for i in list:
            self.list_.pop(i)

inbox = SMS_Store()
inbox.add_new_arrivals(12,9,'some nights i stay up')
inbox.add_new_arrivals(12,5,'cashing in my bad luck')
inbox.add_new_arrivals(14,7,'somenights i call it a draw')
inbox.add_new_arrivals(56,0,'somenights i wish that my lips could built a castle.')
inbox.read_message(0)

Tags: oftextfromselfaddnumbernewread
2条回答

在这种情况下不应该使用继承。下面是更正的版本(也是固定的代码样式):

class Message:
    def __init__(self, from_number, time_arrived, text_of_sms):
        self.has_been_viewed = False
        self.from_number = from_number
        self.time_arrived = time_arrived
        self.text_of_sms = text_of_sms

    def get_time(self):
        return self.time_arrived

    def get_text(self):
        return self.text_of_sms

    def set_view(self):
        self.has_been_viewed = True

    def check_read(self):
        return self.has_been_viewed


class SMSStore:
    def __init__(self):
        self._list = []

    def add_new_arrivals(self, from_number, time_arrived, text_of_sms):
        self._list.append(Message(from_number, time_arrived, text_of_sms))

    def message_count(self):
        return len(self._list)

    def get_unread_index(self):
        return list(filter(lambda m: not m.check_read(), self._list))

    def read_message(self, index):
        return self._list[index].get_text()

    def delete(self, index):
        a = int(index)
        self._list.pop(a)

    def clear(self):
        self._list = []

inbox = SMSStore()
inbox.add_new_arrivals(12, 9, 'some nights i stay up')
inbox.add_new_arrivals(12, 5, 'cashing in my bad luck')
inbox.add_new_arrivals(14, 7, 'somenights i call it a draw')
inbox.add_new_arrivals(56, 0, 'somenights i wish that my lips could built a castle.')
print(inbox.read_message(0))

不清楚错误可能来自何处,因为read_message()仅由代码末尾的inbox.read_message(0)语句调用,而该语句不会产生错误(尽管read_message()方法的返回值始终是None,因为其中没有显式的return语句)。你知道吗

不管怎样,为了回答这个名义上的问题,为了明确地做到这一点,您将使用^{}方法,但这不是这里的问题,即SMS_Store类根本不应该是Message的子类,因为它不是Message类的专门化…而是Message实例的容器。你知道吗

下面是代码的修改版本,它展示了如何将这两个类分开,并使大多数方法(如果不是所有方法)都能工作。它现在也主要遵循PEP 8 - Style Guide for Python Code建议。你知道吗

class Message:
    def __init__(self, from_number, time_arrived, text_of_sms):
        self.has_been_viewed = False
        self.from_number = from_number
        self.time_arrived = time_arrived
        self.text_of_sms = text_of_sms

    def get_time(self):
        return self.time_arrived

    def get_text(self):
        return self.text_of_sms

    def set_viewed(self):
        self.has_been_viewed = True

    def check_read(self):
        return self.has_been_viewed


class SMS_Store:
    def __init__(self):
        self.list_ = []

    def add_new_arrival(self, from_number, time_arrived, text_of_sms):
        self.list_.append(Message(from_number, time_arrived, text_of_sms))

    def message_count(self):
        return len(self.list_)

    def get_unread_index(self):
        unread = []
        for (i, message) in enumerate(self.list_):
            if not message.check_read():
                unread.append(i)
        return unread

    def read_message(self, index):
        message_text = self.list_[index].get_text()
        self.list_[index].set_viewed()
        return message_text

    def delete(self, index):
        self.list_.pop(index)

    def clear():
        self.list_.clear()

inbox = SMS_Store()

inbox.add_new_arrival(12, 9, 'some nights i stay up')
inbox.add_new_arrival(12, 5, 'cashing in my bad luck')
inbox.add_new_arrival(14, 7, 'somenights i call it a draw')
inbox.add_new_arrival(56, 0, 'somenights i wish that my lips could built a castle.')

print(inbox.get_unread_index())  # -> [0, 1, 2, 3]
print(inbox.read_message(0))     # -> some nights i stay up
print(inbox.get_unread_index())  # -> [1, 2, 3]

相关问题 更多 >