1

Python でクラスを作成するとき、ほとんどの場合、使用する変数をオブジェクトのプロパティとして設定したいと考えています。どの変数をクラス/インスタンス属性として使用する必要があり、どの変数を使用してはならないかについて、規則または一般的なガイドラインはありますか?

例えば:

class simple(object):
    def __init(self):
        a=2
        b=3
        return a*b

class simple(object):
    def __init(self):
        self.a=2
        self.b=3
        return a*b

属性はオブジェクトのプロパティである必要があることは完全に理解していますが。これは、クラス宣言が単純な場合は簡単に理解できますが、プログラムがどんどん長くなり、さまざまなモジュール間のデータ交換を行う必要がある場所がたくさんあるため、どこで a/b を使用するか、self.a を使用するかについて混乱します。 /self.b. これに関するガイドラインはありますか?

4

4 に答える 4

6

使用self.aする場所ではプロパティを作成しているため、これはクラスの外部からアクセスでき、その機能を超えて持続します。これらは、オブジェクトに関するデータを保存するために使用する必要があります。

使用aする場所はローカル変数であり、その関数のスコープ内でのみ持続するため、関数内でのみ使用する場所で使用する必要があります (この場合のように)。

__initのように見えますが、__init__コンストラクターではありません。それらをコンストラクターにすることを意図した場合、値を返すことは意味がありません (新しいオブジェクトが返されるため)。

于 2012-04-23T19:34:26.583 に答える
2
class Person(object):
    def __init__(self, name):
        # Introduce all instance variables on __init__
        self.name = name
        self.another = None

    def get_name(self):
        # get_name has access to the `instance` variable 'name'
        return self.name

したがって、変数を複数のメソッドで使用できるようにする場合は、それをinstance変数にします。

上のすべてのインスタンス変数の導入に関する私のコメントに注目してください__init__。以下の例は有効な python ですが、そうしないでください。

class Person(object):
    def __init__(self):
        self.a = 0
    def foo(self):
        self.b = 1 # Whoa, introduced new instance variable

代わりに、すべてのインスタンス変数を on で初期化し、他の値が適切でない場合は__init__それらを に設定します。None

于 2012-04-23T23:57:46.793 に答える
1

実装する前に、自分のクラスの API をどのように見せたいか想像してみます。もし私がこのクラスを書いていなかったら、この特定の変数が何をするかについてのドキュメントを読みたいと思いますか? そのドキュメントを読むだけで時間が無駄になる場合は、おそらくローカル変数にする必要があります。

場合によっては、一部の情報を保持する必要がありますが、必ずしもそれを API の一部にする必要はありません。これは、アンダースコアを追加する規則を使用する場合です。例えばself._some_data_that_is_not_part_of_the_api

于 2012-04-23T21:49:47.503 に答える
1

self パラメーターは、オブジェクト自体を参照します。したがって、クラスの外部でクラス属性を使用する必要がある場合は、それをクラス インスタンスの名前と属性名として呼び出します。self をいつ使用するかについてのガイドラインはないと思います。それはすべて必要に応じて異なります。クラスを構築するときは、作成した変数を何に使用するかを考えるべきです。クラスをインポートするプログラムでその特定の属性が必要になることが確実にわかっている場合は、self を追加します。

于 2012-04-23T22:40:18.320 に答える