2013-12-13 53 views
6

私は、取得、設定、削除のための具体的な方法ではなく、@propertyデコレータをPythonで使用しています。いくつかのコード例を以下に示します。Pythonでgetter、setter、deleterを自動的に設定する

class Person(object): 

    def __init__(self): 

     self._firstName = None 
     self._lastName = None 
     self._age = None 

    @property 
    def firstName(self): return self._firstName 
    @firstName.setter 
    def firstName(self, val): self._firstName = val 
    @firstName.deleter 
    def firstName(self): del self._firstName 

    @property 
    def lastName(self): return self._lastName 
    @lastName.setter 
    def lastName(self, val): self._lastName = val 
    @lastName.deleter 
    def lastName(self): del self._lastName 

    @property 
    def age(self): return self._age 
    @age.setter 
    def age(self, val): self._age = val 
    @age.deleter 
    def age(self): del self._age 

Peter = Person() 

Peter.firstName = 'Peter' 
Peter.lastName = 'Smith' 
Peter.age = 21 

print ' '.join([Peter.firstName, Peter.lastName]) 

ご覧のとおり、この例のコードの大部分は、メソッドの定義です。

私の変数ごとにgetter、setter、およびdeleterを自動的に割り当てる方法があるかどうかです。私の実際のコードでは、より多くの変数があり、それぞれのメソッドを設定する反復コードのように思えます。

私は、単純なケースでは厳密には必要ではないかもしれないが、私はクラスの複雑さを増やすことを決める場合には、今のところメソッドをコーディングする方が好都合であることを認識しています。

+3

* "クラスの複雑さを増やすことに決めた場合に備えて、今のところメソッドをコーディングする方がいいですよ" * - なぜあなたはそれらを必要なときに追加しませんか? *今すぐ*必要なものだけを実装し、コードが大きくなるにつれてリファクタリングします。拡張機能や機能をサポートするために今追加するものはすべて、ノイズだけです。 –

答えて

3

簡単にしてください。

このような関数を使用している場合は、一般にアクセス可能な変数を使用してください。つまり、

class Person(object): 
    def __init__(self): 
     self.firstName = None 
     self.lastName = None 
     self.age = None 

は完全に問題ありません。使用法与えられたより良いアプローチは、このように、コンストラクタの一部としてデータを要求することです:

class Person(object): 
    def __init__(self, firstName, lastName, age): 
     self.firstName = firstName 
     self.lastName = lastName 
     self.age = None 

person = Person('Peter', 'Smith', 21) 

名前は、あなたが常に特定することができ、ある懸念がある場合:

person = Person(firstName='Peter', lastName='Smith', age=21) 

将来、必要に応じてゲッター/セッターを追加することができます。

別の考慮事項は、コンストラクタ与えられた、あなたはPersonオブジェクトの文字列変換関数を作成することができるということです。

def __str__(self): 
    return ' '.join([self.firstName, self.lastName]) 

この後、あなたが好きそれを使用することができます:

person = Person(firstName='Peter', lastName='Smith', age=21) 
print(person) 

だからドンそれが内部的にどのように実装されているかを知る必要はありません。

もう1つの考慮事項は、日本/中国名は最初の姓を置き、人々は(スペインで。ESP)複数の姓を持つことができ、ミドルネームを持つことができるということです。

2

プロパティデコレータの全体のポイントは、ではありません。は最初から定義する必要があります。属性に直接アクセスすることは、プロパティを使用してアクセスすることとまったく同じです。したがって、実際に複雑なロジックを持ち、プロパティに変更するまで完全に残しておく必要があります。

0

マニュアルセッターとデリゲーターの定義は、「私はこのインターフェースを作成するのに多くの時間を費やしましたが、コードを壊すことなくこのプロパティーを設定、削除、取得することができます。

それ以外の場合は、プロパティデコレータを使用せずにインスタンス変数を使用するだけで済みます。

def __init__(self): 

    self.firstName = None 
    self.lastName = None 
    self.age = None 

PEP-8では、Pythonの変数の命名規則とコードのスタイル規則について詳しく説明しています。

関連する問題