2011-07-06 7 views
1

私はそのコンセプトをオーバーロードといいます。 今、私はgetterとsetterのメソッドを提供するクラスを作成しており、デザイン上の問題に悩まされています。Pythonの "メソッドオーバーロード"

両方のメソッドは、単純に値を設定するか、値を返す単一行です。

 
def set_number(self, num): 

    self.count = num 

def get_number(self): 

    return self.count 

スペースを節約し、クラスは基本的に一つに二つの方法を組み合わせて、そしてちょうどnum引数があるかどうかに応じて実行すべきラインを決定します何かをすることによって、より小さな「見た目」にする方が良いだろう提供された?

私は明瞭に固執し、それらを分離しておく必要がありますか?何人かの人々は、これらの1ライナーをそれぞれ独自に保つのは「宇宙の浪費」だと感じている人もいれば、それを分かち合いたいと思う人もいます。

いずれかの理由を選択する理由は何ですか?

+4

'@ property'を使用してください。それはあなたのためにこれを簡素化し、すべての手を絞って削除します。 –

答えて

10

Pythonでは、getterとsetterをまったく使用しない方がよいでしょう。単にcountという属性を直接参照するだけです。 print instance.countまたはinstance.count = 5

ゲッターやセッターにロジックを追加する必要がある場合に備えて、他の言語のゲッターとセッターのポイントは、カプセル化と将来のためのものです。 Pythonでは、後でpropertyを使用してこれを達成できます。これは既存のAPIを破壊しません。

@property 
def number(self): 
    # do extra logic if necessary 
    return self.count 

プロパティもセッターを持つことができます - 参照:http://docs.python.org/library/functions.html#property

Pythonのは、Javaではありません。 =)

追加ボーナス読み物:

+0

ああ、それはかなりクールです。後でこれを本当に必要とするなら、セッターを追加することができます。 – MxyL

+0

tomaykoとコメントの記事を読んで、それが最良の選択肢ではない理由がいくつかあるようですが、同じことを言及しているかどうかはわかりません。 – MxyL

+0

@日本:特記すべきケア?私が見たことは、記事を適切に読まないことに由来する非常に主観的な発言か、後の発言で払拭された発言です。 – delnan

-1

Iは、コードreadabiltyとmaintainabiltyのために二つの別々のメソッドとしてそれを残すことになります。

2

一般に、Pythonでは、明示的なゲッター/セッターメソッドを使用するのは非常に難しいスタイルです。

In [1]: class Foo(object): 
    ...:  def __init__(self): 
    ...:   self.num = 1 
    ...:   
    ...:   
In [2]: f = Foo() 
In [3]: f.num 
Out[3]: 1 
In [4]: f.num = 2 
In [5]: f.num 
Out[5]: 2 

あなたが本当にロジックが必要な場合は、propertiesを使用することにより、後日、この同じAPIを維持することができます:ちょうどこのような何かを行います。機能を追加しながら、同じインターフェイスが下に保持されていることに注目してください。その用語は、ここでは適用されません - "のオーバーロード" について

In [8]: class Foo(object): 
    ...:  def __init__(self): 
    ...:   self._num = 1 
    ...:  @property 
    ...:  def num(self): 
    ...:   return self._num 
    ...:  @num.setter 
    ...:  def num(self, num): 
    ...:   if num < 0: 
    ...:    raise ValueError("Your Foo would be too small!") 
    ...:   self._num = num 
    ...:   
    ...:   
In [10]: f = Foo() 
In [11]: f.num 
Out[11]: 1 
In [12]: f.num = 2 
In [13]: f.num 
Out[13]: 2 
In [14]: f.num = -1 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 

/home/Daenyth/<ipython console> in <module>() 

/home/Daenyth/<ipython console> in num(self, num) 

ValueError: Your Foo would be too small! 

。これは、オブジェクト上のメソッドの定義を変更することによって、+,==などの演算子の動作を変更するための用語です。いくつかのオーバーロードをPythonで行うことができます__cmp__, __add__, and so on.

+0

これは「オーバーライド」です。オーバーロードとは、同じ名前で署名が異なる2つのメソッドを意味します。あなたはPythonでは本当にできません。 – FogleBird

+0

@FogleBird;ダー、そうだよ。私はそれが混ざり合った。あなたは '__cmp__'などでいくつかのオーバーロードを行うことができます。 – Daenyth

+0

@FogleBird:もちろん、あなたは '(* args、** kwargs)'を使うことができるので、必要はありません。渡されたパラメータの数/数に基づいて動作が異なります。 – geoffspear

関連する問題