いすをご利用の取得/設定パターン(Python)?
-
24-09-2019 - |
質問
用の取得/設定がごく普通のJava、様々な理由がほとんど見Pythonコードを使用します。
していただくことは避けget/setメソッドはPython?
解決
クールリンク: Pythonのは、Java のではありません。)
ではJavaは、あなたが公共のフィールドを使用して、あなたに戻って以降のゲッターとセッターを使用するあなたの心を変更する機会を与えないため、ゲッターとセッターを使用する必要があります。だから、Javaで、あなたにも、フロントアップ方法の雑用を得る可能性があります。あなたは、通常の属性で始まり、クラスのすべてのクライアントに影響を与えずに、いつでもあなたの心を変更することができますので、Pythonでは、これは、愚かです。だから、書き込みないゲッターとセッターの操作を行います。
他のヒント
それが公開されているので、Pythonでは、あなただけの直接の属性にアクセスすることができます:
class MyClass:
def __init__(self):
self.my_attribute = 0
my_object = MyClass()
my_object.my_attribute = 1 # etc.
あなたが属性のアクセスまたは変異に何かをしたい場合は、使用することができますプロパティはします:
class MyClass:
def __init__(self):
self._my_attribute = 0
@property
def my_attribute(self):
# Do something if you want
return self._my_attribute
@my_attribute.setter
def my_attribute(self, value):
# Do something if you want
self._my_attribute = value
決定的、クライアントコードは同じまま。
こちらはGuido van Rossum"ということ 時点で規約に同プログラミング
ということは何ですか"との闘い言語"?
Guido: するとい 頑生活習慣のこと く異なる言語です。
[...]人くら クラスは、転んでもただでは起きアクセスへ アクセス用メソッドの方法
そんな賢いPython;いより詳細なコードで
くのデバッグも行ってく遅くなります。い表現に書き込み FORTRANの他養成講座を開催します。" まJava言語です。
いいえ、それはunpythonicです。一般的に受け入れられている方法は、通常のデータ属性を使用してプロパティを持つより複雑な取得/設定ロジックを必要とするものを交換することです。
あなたの質問への短い答えは、必要なときにいない、あなたがプロパティを使用する必要があります。ライアンTamyokoは彼の記事ゲッター/セッター/ Fuxorsする
に長い答えを提供しますは、このすべてから奪うための基本的な値は、必ず、コードのすべての単一の行は、プログラマにはいくつかの値または意味を持っていることを確認するために努力したいということです。プログラミング言語は、人間ではなく、マシンのためのものです。あなたは、コードを持っている場合、それは何も有効ではありませんように見えますが、読みにくい、または退屈思われること、そしてチャンスはPythonは、あなたがそれを削除できるようになるいくつかの言語機能を持っていることを良いです。
あなたの観察が正しいです。これは、Pythonプログラミングの通常のスタイルではありません。あなたがそれら(だけでなく、クラスまたはインスタンス)を持つ任意のオブジェクトの属性と同じように、あなただけのアクセス、それらを(、、セットを取得削除)ので属性は、すべて公開されています。これは、JavaプログラマはPythonの構文を使用してJavaのような彼らのPythonコードを検索するためのPythonを学ぶ際に伝えるのは簡単です!
私は間違いなく設定(および取得)の標準的な方法よりも複雑なものクラスとインスタンスの属性という最大の提案@フィリップの有名な記事とのへのマキシのリンクはであり、特に@、以前のすべてのポスターに同意します取得した属性の設定をカスタマイズする(さらに一般化するまたは記述子)の使用のプロパティ! (これは、独自にカスタマイズした民間のバージョンでは、保護された、友人、または任意のポリシーパブリック以外のものを望むならば、あなたが希望を追加することがあることを含む。)
興味深いデモように、、 コアのPythonプログラミングする (第13章、セクション13.16)私は、ディスクへの代わりに、メモリ内の属性を格納するための記述子を使用する例を思い付きました!はい、あなたに何ができるかの例を示し、それが永続ストレージの奇妙な形だが、それははを行います!
ここでは、同様に有用であるかもしれないことを別の関連記事です: パイソン:複数のプロパティ一セッター/ゲッターの
私はその答え(残念ながら、私はできなかった)のためにここに来ていました。しかし、私はの他の場所の周りの仕事を見つけました。コードの下にこれは に取得するための代替可能性があります。
class get_var_lis:
def __init__(self):
pass
def __call__(self):
return [2,3,4]
def __iter__(self):
return iter([2,3,4])
some_other_var = get_var_lis
これはただの回避策のです。上記の概念を使用することによりuが簡単すぎPYで取得/設定の方法論を構築することができます。
私たちの先生は、私たちがアクセサ関数を使用する必要があるときを説明するクラスに一例を示しました。
class Woman(Human):
def getAge(self):
if self.age > 30:
return super().getAge() - 10
else:
return super().getAge()