2012-01-08 38 views
-1

私はアドレス帳に追加して更新するプログラムを書いています。ここに私のコードは次のとおりです。pythonでアドレス帳プログラムを書く際の問題

EDITED

import sys 
import os 

list = [] 

class bookEntry(dict): 
    total = 0 

    def __init__(self): 
     bookEntry.total += 1 
     self.d = {} 

    def __del__(self): 
     bookEntry.total -= 1 
     list.remove(self) 

class Person(bookEntry): 
    def __init__(self, n): 
     self.n = n 
     print '%s has been created' % (self.n) 

    def __del__(self): 
     print '%s has been deleted' % (self.n) 

    def addnewperson(self, n, e = '', ph = '', note = ''): 
     self.d['name'] = n 
     self.d['email'] = e 
     self.d['phone'] = ph 
     self.d['note'] = note 

     list.append() 

    def updateperson(self): 
     key = raw_input('What else would you like to add to this person?') 
     val = raw_input('Please add a value for %s' % (key)) 
     self.d[key] = val 
def startup(): 
    aor = raw_input('Hello! Would you like to add an entry or retrieve one?') 
    if aor == 'add': 
     info = raw_input('Would you like to add a person or a company?') 
     if info == 'person': 
      n = raw_input('Please enter this persons name:') 
      e = raw_input('Please enter this persons email address:') 
      ph = raw_input('Please enter this persons phone number:') 
      note = raw_input('Please add any notes if applicable:') 

      X = Person(n) 
      X.addnewperson(n, e, ph, note) 
startup() 

私はこのコードを実行すると、私は次のエラーを取得する:

in addnewperson 
    self.d['name'] = n 
AttributeError: 'Person' object has no attribute 'd' 

私は2つの質問があります。

UPDATED質問に 1.なぜdオブジェクトが継承しないのですかd:bookentry()

私はこの質問/コードが長いことを知っていますが、ここからどこに行くのかわかりません。どんな助けでも大歓迎です。

+0

多くの問題はすでに述べられています(多くは言及されていません)。もう1つ:モジュールレベル(リスト= [])のシャドーリストには良いことではありません。リストの別の名前を選択するか、電話帳クラスに小冊子 –

+0

@ RomanSusiを入れるようにしてください。なぜこれが設計/機能の観点から優れているのか説明できますか? – dopatraman

+0

@codeninja ** list **はstarndard python型です。そのため、別の名前を使用する方が良い理由です。 PhoneBookの提案では、複数のエントリを持つことができます。これは、現在使用できない場合でもプログラムの拡張性を向上させます(この場合、PhoneBookをシングルトンとして扱うことができます)。 – mgibsonbr

答えて

4
  1. addnewpersonは、最初の引数として '自己' を持ってshoud。実際には、名前は重要ではありません( '自己'は慣例にすぎません)。しかし、最初の引数はオブジェクト自体を表します。あなたの場合、それはnを「自己」と解釈し、他の3つは通常の引数として解釈します。

  2. ____は、「self」以外の引数を取ってはならない。

編集:クラスのメンバではなく、インスタンスメンバbookentryで

1)Dさ:ところで、私は多分あなたが知っじゃないことを、あなたの例では、いくつかの他の問題を見つけました。これはすべてのブックエントリーのインスタンスによって共有されます。インスタンスメンバを作成するには、使用:あなたは、Java、C++など)で行うように(D直接アクセスしようとしているが、Pythonはそれをサポートしていません

class bookentry(dict): 
    def __init__(self,n): 
     self.d = {} 
     # rest of your constructor 

2)。あなたの方法で「自己」のパラメータを持っており、それを介してインスタンス変数にアクセスする必要があります。

class person(bookentry): 
    def foo(self,bar): 
     self.d[bar] = ... 

person().foo(bar) 

更新:最後の問題のために、解決策は(Pythonで明示的に行う必要があります)スーパーコンストラクタを呼び出すことです:

class Person(bookEntry): 
    def __init__(self, n): 
     super(Person, self).__init__() 
     self.n = n 
     print '%s has been created' % (self.n) 

簡単な説明:オブジェクト指向言語における背景多重継承せずに持つ人々のために、それは誰もが言及されていない場合は、自動的に最適なものを選択する、スーパータイプのコンストラクタが暗黙的に呼び出されることを期待するのが自然な感じ明示的に。しかし、クラスが同時に2つ以上のクラスから継承できるときには、面倒なことが起こります。このため、Pythonはプログラマが自分で選択する必要があります。それとも全く?

コンストラクタ(およびデストラクタ)の動作は、言語によって大きく異なる場合があります。 Pythonオブジェクトのライフサイクルについてさらに質問がある場合は、開始するのがよい場所はhere,herehereとなります。

bookEntryの__init__は、人の__init__で呼び出されていないためだ
+0

@ mgibsonbr - ヒントのおかげで。私はまだいくつかの質問があります:id '__del__'は' self'以外の引数を取っていません。このステートメントはどのように動作しますか: 'def __del __(self): \t \t '%sは削除されました'% ) ' つまり、' n 'はどのように渡されますか? – dopatraman

+0

@magibsonbr - また、 'self.d'を使うと、' self'が定義されていないというエラーが出ます... – dopatraman

+0

@codeninja 'n'をインスタンス変数として保存しなければならないと思います'__del__'の' self.n'を使ってアクセスしてください。 2番目のコメントについて私はあなたのコードを見ることなくあなたを助けることはできません(あなたのメソッドの最初の引数として 'self'を渡さなかったのでしょうか?) – mgibsonbr

4
  1. why isnt the d object being inherited from bookentry()?

:その機能が使用されていない場合

super(Person, self).__init__() 

ところで、なぜ辞書を継承?それを削除してオブジェクトから継承する方が良いです(クラス名は通常キャメルケースです)。

class BookEntry(object): 
+0

@ RomanSusi - 2質問:1.それ以外のもので 'Person'によって継承された' bookEntry'の '__init__'は何ですか? 2. 'dict'を継承しないと' bookEntry'が辞書のように振舞うようになりますか?ここでの目標は辞書のリスト(アドレス帳) – dopatraman

+0

を持っていることです。\\ \ init \ _ \ _と置き換えました。そのため、スーパークラスから呼び出す責任があります。 2.私はdictの振る舞いについて何のヒントも見ません。逆にself.dは値を保持するためのものです。たぶん、あなたはdictの動作をサポートするいくつかのメソッドを省略しましたか?今、あなたは2つのdictsを持っています:自己と自己 –

関連する問題