web-dev-qa-db-ja.com

Pythonでリストオブジェクトクラスを作成する

基本的な質問です。私は次のコードを試しています:

class SMS_store:

def __init__(self):
    self=[]    #probably something is wrong here

def add_new_arrival(self,from_number,time_arrived,text_of_SMS):
    self.append([False,from_number,time_arrived,text_of_SMS])    #append list to self list
    self[len(self)-1]=Tuple(self[len(self)-1])

def message_count(self):
    return len(self)

my_inbox=SMS_store()
my_inbox.add_new_arrival('01234','9:37 AM','How are you?')

しかし、次のエラーが発生します。

>>> 
Traceback (most recent call last):
  File "C:\Users\Arnob\Desktop\New Text Document.py", line 15, in <module>
    my_inbox.add_new_arrival('01234','9:37 AM','How are you?')
  File "C:\Users\Arnob\Desktop\New Text Document.py", line 8, in add_new_arrival
    self.append([False,from_number,time_arrived,text_of_SMS])    #append list to self list
AttributeError: 'SMS_store' object has no attribute 'append'
>>>

私のコードの何が問題になっていますか?

7
arnobpl

このようにlistをサブクラス化できます

class SMS_store(list):

    def add_new_arrival(self, from_number, time_arrived, text_of_SMS):
        self.append((False, from_number, time_arrived, text_of_SMS))    #append Tuple to self

    def message_count(self):
        return len(self)

そこで何か特別なことをしたいのでなければ、__init__は必要ないことに注意してください。

リストを追加してからタプルに変換する必要はありません。()の代わりに[]を使用してタプルを直接作成できます。

3
John La Rooy

listから継承する場合は、以下を使用します。

class SMS_store(list):
               ^^^^^^

__init__メソッドからselfへの割り当てを削除します。

そうは言っても、リストを含む名前付き属性が必要な場合があります。

class SMS_store(object):

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

   def add_new_arrival(self, from_number, time_arrived, text_of_SMS):
      self.messages.append((False,from_number,time_arrived,text_of_SMS))

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

my_inbox = SMS_store()
my_inbox.add_new_arrival('01234','9:37 AM','How are you?')

実際のメッセージを表す限り、これは namedtuple の良いユースケースのように聞こえます。タプルと同じですが、名前でフィールドにアクセスできます。ここに簡単なイラストがあります:

import collections

SMS = collections.namedtuple('SMS', 'from_number time_arrived text_of_SMS')

sms = SMS(from_number='01234', time_arrived='9:37 AM', text_of_SMS='How are you?')
print sms.text_of_SMS
4
NPE

それでも通常の変数名を作成する必要があります。プレフィックスとしてself.を付けるだけです。

self.mylist = []

アクセスするには、次のようにします。

self.mylist.append(n)

または:

self.mylist[3] = 'hi'

実際にはselfをオーバーライドしています。あなたはそれをしたくありません。

2
TerryA