0

Pythonでのプログラミングの正しい方法について質問があります...多分いくつかの異なる意見があるかもしれませんが、ここにそれがあります:

いくつかのプライベート属性を持つクラスがあり、2つのゲッター/セッターを実装したとしましょう(オーバーロード__getattr____setattr__はなく、より「Java-tistic」スタイルで):

class MyClass:

    def __init__(self):   
        self.__private1 = "Whatever1"

    def setPrivate1(self, private1):
        if isinstance(private1, str) and (private1.startswith("private")):
            self.__private1 = private1
        else:
            raise AttributeError("Kaputt")

    def getPrivate1(self):
        return self.__private1

次に、同じクラスの別のメソッドで、その「__private1」の値を再設定する必要がある数行を考えてみましょう。同じクラスなので、プライベート属性self.__private1に直接アクセスできます。

私の質問は:私は使用する必要があります:

self.setPrivate1("privateBlaBlaBla")

または、次のように直接アクセスする必要があります。

self.__private1 ="privateBlaBlaBla"

私が新しい値を設定しているので、その値( "privateBlaBlaBla")が正しい( "private"で始まるstr())ことがわかっているので、システムに一貫性がなくなることはありません。一方、別のプログラマーが私のコードを取得し、self .__ private1属性の機能を変更する必要がある場合、彼はすべてのコードを調べて、__private1の値が別の場所で手動で設定されているかどうかを確認する必要があります。

私の推測では、常にsetPrivate1メソッドを使用し、get / setの__private1変数に直接アクセスするだけですが、経験豊富なPythonプログラマーの意見を知りたいと思います。

4

2 に答える 2

8

悪いPythonの典型的な例を提示して、それに対して何をするかについて人々が意見を持っていることを期待することはできません。ゲッターとセッターを使用します。

class MyClass:
    def __init__(self):   
        self._private1 = "Whatever1"

    @property
    def private1(self):
        return self._private1

    @private1.setter
    def private1(self, value):
        self._private1 = value

補足コメント-二重アンダースコア名を使用すると、混乱を招く可能性があります。これは、Pythonが実際に名前をマングルして、クラス外からのアクセスを阻止するためです。これは本当のセキュリティを提供しませんが、頭痛の種を終わらせることはありません。頭痛の種を回避する最も簡単な方法は、基本的にの一般的な規則である単一アンダースコア名を使用することですprivate。(Hは。)


意見が必要な場合は、プロパティを使用してください=)。JavaPythonの怪物について意見が必要な場合は、セッターを使用します。結局のところ、あなたはそれを書いたのです。変数を手動で設定することに明らかな利点はありませんが、いくつかの欠点があります。

于 2010-10-26T16:51:13.460 に答える
2

ない。Pythonでは、ゲッターやセッターではなく、プロパティを使用します。

class MyClass:

    def __init__(self):   
        self._private1 = "Whatever1"
    @property
    def private1(self):
        return self._private1
    @private1.setter
    def private1(self, private1):
        if isinstance(private1, str) and (private1.startswith("private")):
            self._private1 = private1
        else:
            raise AttributeError("Kaputt")

次に、コードの後半で、次のように_private1属性を設定します

self.private1="privateBlaBlaBla"
于 2010-10-26T16:50:50.637 に答える