5

私はクラスの人を初期化するための口述を受けます。直接1つのフィールドがあります:'名前'。「name」フィールドはオプションです。つまり、dictに「name」項目がない場合、personの「name」値はありません。getterメソッドを使用してインスタンス属性を取得しますが、「name」値がない場合はエラーがスローされます。コードを改善するための優れたプログラミングスタイルがあるかどうかわかりません。Pythonは実行時にインスタンスフィールドを作成するため、Javaのようなgetterの使用方法がわかりません。

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インスタンスに属性'name'がありません

4

3 に答える 3

6
class Person:

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

この場合self.name = person_dict.get('name')、Exceptionは発生せず、Personオブジェクトにはname属性があります(Noneデフォルト)

UPD。getName方法が役に立たないので、例から切り詰めました。nameattrに直接アクセスします。

于 2012-04-18T13:54:47.380 に答える
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
于 2012-04-18T13:56:20.163 に答える
0

例外が必要ない場合は、インスタンスに。の値があることを確認する必要がありますname。インスタンスで属性が見つからない場合、ルックアップはクラスにフォールバックするため、これを行う簡単な方法はname = None、クラス定義に(またはインスタンスで使用するデフォルト値を)追加することです。インスタンスの属性に割り当てると、デフォルト値が「非表示」になります。

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

__init__代わりに、次のように書くことができます。

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

キーが見つからない場合、辞書のget()メソッドが返されます。または、別のデフォルト値を使用して2番目の引数を指定できます。None

于 2012-04-18T13:58:28.413 に答える