2012-04-18 17 views
5

私はクラスの人を初期化するためのdictを取得します。人の中には「名前」というフィールドが1つあります。 'name'フィールドはオプションです。つまり、dictに 'name'項目がない場合、personの 'name'値はありません。インスタンス属性を取得するためにゲッターメソッドを使用しますが、 'name'値がない場合はエラーをスローします。私は自分のコードを改善する良いプログラミングスタイルがあるのか​​分かりませんか? Pythonは実行時にインスタンスフィールドを作成するので、javaのようなgetterの使い方はわかりません。python:インスタンス属性のエラー

class Person: 
    def __init__(self,person_dict): 
     try: 
      self.name = person_dict['name'] 
     except Exception: 
      pass 

    def getName(self): 
     return self.name 

pdict = {} 
p = Person(pdict) 
print p.getName() 

はAttributeError:Personインスタンスには、属性 '名前' self.name = person_dict.get('name')は、例外を発生させないであろうと、Personオブジェクトは、(デフォルトではNone

UPDをname属性を持つことになります。この場合

+0

あなたがすでに答えで見てきたように、ゲッターは「pythonic」ではありません。いいpythonコードではありません。 [ここ](http://tomayko.com/writings/getters-setters-fuxors)は、なぜこれについてのすばらしい記事です。記事をまとめるには、Javaではgetter/setterが必要です。それがなければ、それを使うためのリファクタリングは難しいからです。 pythonでは、[properties](http://docs.python.org/library/functions.html#property)を使用することができるので、インタフェースを変更する必要はありません。 – Darthfett

答えて

6
class Person: 

    def __init__(self,person_dict): 
     self.name = person_dict.get('name') 

を持っていません。 getNameの方法は役に立たないので、例から切り捨てます。直接name attrにアクセスしてください。あなたは例外をしたくない場合は

+0

「getter」メソッドはPythonでの悪い習慣であり、直接アクセスすることは注目に値することです。 –

+0

私はちょうど彼のコードを繰り返した。 – San4ez

+0

私は知っている、私はちょうどよりよいものであることをメモする答えを言っている。 –

3
class Person: 
    def __init__(self,person_dict): 
     self.name = person_dict.get('name', 'default_name') 

pdict = {} 
p = Person(pdict) 
print p.name # there is no need for getter 
+0

+1。これは良い答えです、ゲッターは悪い習慣です。 –

+0

ありがとう、今私は使用ゲッターisnot良いスタイルを知っている – remy

0

、あなたは、インスタンスがnameの値を持っていることを確認しなければなりません。インスタンスで属性を見つけることができない場合、ルックアップはクラスに戻ってしまうので、簡単に行うには、name = None(またはインスタンスに使用するデフォルト値)をクラス定義に追加するだけです。インスタンス上の属性に代入すると、デフォルト値が「非表示」になります。

def __init__(self,person_dict): 
    self.name = person_dict.get('name') 

キーが見つからない場合は、辞書のget()方法はNoneを返すか、別のデフォルト値を第二引数を提供することができます:あなたは、代わりにこのようなあなたの__init__を書くことができ

class Person: 
    name = None 
    def __init__(self,person_dict): 
     try: 
      self.name = person_dict['name'] 
     except Exception: 
      pass 

関連する問題