1

これはおそらく非常に重要な質問です。申し訳ありません。私は、プライベート属性のゲッター関数とセッター関数を構築している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 AClass Bからの情報が必要になることはほとんどありませんClass Aが、私のプロジェクトでは、ユーザーが に情報を提供しないことを選択した場合Class B、合理的な解決策を推測するための土壇場の試みを行うステートメントがある状況が 1 つあります。そこからの情報が必要Class Aですが、通常は必要ありません。

Class B私は常にその情報を持っているように構築することができましたが、それはほとんどの場合、その時間とメモリを無駄にしていることを意味します (些細なことかもしれませんが)。これを具体化するには、次のように想像してください。

toothbrushユーザーが好みのブラッシング体験bristlesbristles提供すれば、「ソフト」または「ハード」ブラシのいずれかに適した多数の剛毛を作成できます。しかし、ユーザーがこれを提供しない場合は、表面積bristlesを尋ねて、平均値を推測できるようにします。brush

私はこれを思いつきましたが、Python プログラマーが私を嫌うだろうという直感は持っています。理由を理解したいだけです:

@staticmethod
def request(self, var):
    appIndex = self.__dict__
    if appIndex[var]:
        return appIndex[var]

print Class.request(instance, var)

魅力のように機能しますが、これは Python の異端だと思います。なんで?

4

2 に答える 2

10

あなたが探しているのはproperties

class Foo():
    def __init__(self):
        self._spam = 0

    @property
    def spam(self):
        print("in the getter: ")
        return self._spam

    @spam.setter
    def spam(self, move):
        print("in the setter: ")
        self._spam = move + self._spam

f = Foo()
f.spam = 2
print(f.spam)

出力:

in the setter: 
in the getter: 
2
于 2013-04-24T19:39:21.770 に答える
-1

まず、Python にはプライベート変数がありません。あなたが言及しているのは、ネームマングリングです。目的は、モジュールをインポートする際の名前の衝突を防ぐことです。変数の前に 2 つのアンアンダースコアを付けてクラスに変数を記述すると、その変数の前にクラスの名前が追加されます。__var__そのため、Python の「プライベート」なもののカスタムである変数「」に名前を付ける方が賢明です。

一方、Python では、変数を設定したり取得したりできるようにしたい場合は、通常、直接アクセスを許可するのが最も理にかなっています (Java や他の言語とは異なります)。

于 2013-04-24T19:44:20.677 に答える