8

SMS_Inbox の基本的な機能を提供する単純な python プログラムを作成しています。SMS_Inbox メソッドを作成しました。

store = []
message_count = 0
class sms_store:
    def add_new_arrival(self,number,time,text):
        store.append(("From: "+number, "Recieved: "+time,"Msg: "+text))
        **message_count += 1**
    def delete(self,i):
        if i > len(store-1):
            print("Index does not exist")
        else:
            del store[i]
            message_count -= 1

太字のビットで、エラーが発生しています。

UnboundLocalError: local variable 'message_count' referenced before assignment.

空のリストであるグローバル変数ストアを作成しましたが、これは add_new_variable オブジェクトを使用すると機能します。ただし、何らかの理由で、グローバルな message_count 変数に値を追加していません。

助けてください

4

3 に答える 3

12

それはクラスがどのように機能するかではありません。データは、グローバルではなく、クラス インスタンス内に格納する必要があります。

class SMSStore(object):
    def __init__(self):
        self.store = []
        self.message_count = 0

    def add_new_arrival(self,number,time,text):
        self.store.append(("From: "+number, "Recieved: "+time,"Msg: "+text))
        self.message_count += 1

    def delete(self, i):
        if i >= len(store):
            raise IndexError
        else:
            del self.store[i]
            self.message_count -= 1

sms_store = SMSStore()
sms_store.add_new_arrival("1234", "now", "lorem ipsum")
try:
    sms_store.delete(20)
except IndexError:
    print("Index does not exist")

print sms_store.store

# multiple separate stores
sms_store2 = SMSStore()
sms_store2.add_new_arrival("4321", "then", "lorem ipsum")
print sms_store2.store
于 2013-04-25T08:50:18.953 に答える
9

参照している変数が である場合message_count、エラーは、Python では変数globalを編集する前に変数を指定する必要があるためです。

これはうまくいくはずです。

store = []
message_count = 0
class sms_store:
    def add_new_arrival(self,number,time,text):
        global message_count
        store.append(("From: "+number, "Recieved: "+time,"Msg: "+text))
        message_count += 1
    def delete(self,i):
        if i > len(store-1):
            print("Index does not exist")
        else:
            global message_count
            del store[i]
            message_count -= 1

上記のように__init__、宣言するのではなく、関数にカプセル化した方がよいでしょうglobal

于 2013-04-25T08:51:54.017 に答える
1

message_count次のように宣言せずに、グローバル変数に代入しようとしています。

message_count = 0

class sms_store:
    def add_new_arrival(self,number,time,text):
        store.append(("From: "+number, "Recieved: "+time,"Msg: "+text))
        global message_count
        message_count += 1

グローバルの使用を避けるか、少なくとも変数をクラス属性としてカプセル化してください。

class sms_store:
    message_count = 0
    store = []

    def add_new_arrival(self,number,time,text):
        sms_store.append(("From: "+number, "Recieved: "+time,"Msg: "+text))
        sms_store.message_count += 1

ただし、クラスインスタンスには状態がないため、ここでクラスを作成しても意味がありません。それはあなたの目的を混乱させるだけです。

状態をインスタンスに保存するか、グローバル関数を使用します (したがって、クラスをまったく使用しないでください)。前者は後者よりも好ましい。

適切な PEP-8 スタイルガイドの命名と文字列の書式設定を使用して、インスタンスが状態を保持するクラスにセットアップを変換します。

class SMSStore(object):
    def __init__(self):
        self.store = []
        self.message_count = 0

    def add_new_arrival(self, number, time, text):
        self.store.append('From: {}, Received: {}, Msg: {}'.format(number, time, text))
        self.message_count += 1

次に、 1 つのインスタンスを自由に作成し、必要に応じてそれをグローバルとして使用できます。

sms_store = SMSStore()

他のコードは を使用するだけですsms_store.add_new_arrival(...)が、状態は 1 つのインスタンスにカプセル化されます。

于 2013-04-25T08:51:30.757 に答える