基本的な質問です。私は次のコードを試しています:
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'
>>>
私のコードの何が問題になっていますか?
このように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__
は必要ないことに注意してください。
リストを追加してからタプルに変換する必要はありません。()
の代わりに[]
を使用してタプルを直接作成できます。
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
それでも通常の変数名を作成する必要があります。プレフィックスとしてself.
を付けるだけです。
self.mylist = []
アクセスするには、次のようにします。
self.mylist.append(n)
または:
self.mylist[3] = 'hi'
実際にはself
をオーバーライドしています。あなたはそれをしたくありません。