これはおそらく非常に重要な質問です。申し訳ありません。私は、プライベート属性のゲッター関数とセッター関数を構築しているPHPから使い慣れたPythonで効果を達成しようとしています。
PHP では、一般的に次のようなことを行います。
<?php
class newClass() {
private $var = null;
function newClass($initVal) {
//init
}
public function get($var) {
if ( isset($this->$var) ) {
return $this->$var;
}
}
}
?>
しかし、Pythonで同じアイデアを試してみてください:
class newClass():
def __init__(self, initVal):
self.__nameOfVar1 = initVal
self.__nameOfVar2 = initVal
def get(self, var):
#assuming, when called, var = nameOfVar1
if self.__var:
return self.__var
エラーをスローしますAttributeError:'newClass' object has no attribute '__var'
そして、当然のことながら、そうではありません。プライベート属性にアクセスするゲッター関数とセッター関数を作成するにはどうすればよいですか?
アップデート:
Python の初心者が他の言語からどの規則を誤って持ち込んでいるかを学ぶのに役立つと思われるため、元の質問を残しました。しかし、実際には、私の最初の問題は少し異なっていました。問題をより一般的なものにしようとして、実際の必要性を曖昧にしました。そこで、次のように修正します。
実際、私はプライベート属性を扱っていませんでした。実際、私はコンポジション環境を通じてアトリビュートを下方に渡そうとしています。すなわち:
Class A
には、属性として、Class B
から継承されないオブジェクトがありますClass A
。Class B
からの情報が必要になることはほとんどありませんClass A
が、私のプロジェクトでは、ユーザーが に情報を提供しないことを選択した場合Class B
、合理的な解決策を推測するための土壇場の試みを行うステートメントがある状況が 1 つあります。そこからの情報が必要Class A
ですが、通常は必要ありません。
Class B
私は常にその情報を持っているように構築することができましたが、それはほとんどの場合、その時間とメモリを無駄にしていることを意味します (些細なことかもしれませんが)。これを具体化するには、次のように想像してください。
toothbrush
ユーザーが好みのブラッシング体験bristles
をbristles
提供すれば、「ソフト」または「ハード」ブラシのいずれかに適した多数の剛毛を作成できます。しかし、ユーザーがこれを提供しない場合は、表面積bristles
を尋ねて、平均値を推測できるようにします。brush
私はこれを思いつきましたが、Python プログラマーが私を嫌うだろうという直感は持っています。理由を理解したいだけです:
@staticmethod
def request(self, var):
appIndex = self.__dict__
if appIndex[var]:
return appIndex[var]
print Class.request(instance, var)
魅力のように機能しますが、これは Python の異端だと思います。なんで?