19

これは、Python で属性「Speed」を持つクラス「Car」を定義する方法ですか? 私のバックグラウンドは Java であり、Python では get/set メソッドを使用していないようです。

class Car(object):
    def __init__(self):
        self._speed = 100

    @property
    def speed(self):
        return self._speed

    @speed.setter
    def speed(self, value):
        self._speed = value
4

3 に答える 3

28

Python では、通常、 getter と setterを避けます。.speed属性を持っているだけです:

class Car(object):
    speed = 0

    def __init__(self):
        self.speed = 100

動機と避けるべきその他の落とし穴については、Python は Java ではありませんを参照してください。

Java では、getter と setter を使用する必要があります。public フィールドを使用すると、後で getter と setter を使用するように変更する機会がなくなるからです。したがって、Java では、前もって雑用を片付けたほうがよいでしょう。Python では、クラスのクライアントに影響を与えることなく、通常の属性から始めていつでも変更できるため、これはばかげています。したがって、ゲッターとセッターを記述しないでください。

property属性を取得、設定、または削除するときにコードを実行する必要がある場合に使用します。検証、キャッシング、副作用などはすべて、プロパティの公正な使用例です。必要になるまで使用しないでください。

于 2013-03-29T16:13:27.347 に答える
1

技術的には、Python では属性が非公開になることはないため、get/set メソッドは「pythonic」とは見なされません。これは、オブジェクト属性にアクセスする標準的な方法です:

class MyClass():
    def __init__(self):
        self.my_attr = 3

obj1 = MyClass()
print obj1.my_attr #will print 3
obj1.my_attr = 7
print obj1.my_attr #will print 7

__もちろん、引き続き getter と setter を使用することもできます。また、属性の先頭に追加することで、プライベート メンバーをエミュレートすることもできます。

class MyClass():
    def __init__(self):
        self.__my_attr = 3
    def set_my_attr(self,val):
        self.__my_attr = val
    def get_my_attr(self):
        return self.__my_attr

obj1 = MyClass()
print obj1.get_my_attr() #will print 3
obj1.set_my_attr(7)
print obj1.get_my_attr() #will print 7

変数名を「マングル」します。定義されて__いるクラスの外側から、次のように名前が変更されます。上記の例では、ゲッターとセッターを使用する代わりに、単純に を使用できます。そのため、属性の外部使用を思いとどまらせますが、Java修飾子のように禁止するわけではありません。classname__attr__attr_classname__attrobj1._MyClass__my_attr__private

質問で述べたように、Python で使用できるプロパティもあります。プロパティの利点は、クラスの外部から通常のメンバー属性として簡単にアクセスできるように見える値を返すか設定する関数を実装するために使用できることです。

于 2013-03-29T16:22:08.477 に答える
0

私は次のような属性に行きます:

class Car(object):
    def __init__(self):
        self.speed = 100

どこで変更して、まったく同じ方法で取得できます。この@property表記法は、Java/C の get/set メソッドや仮想属性を使用するクラスをラップする場合や、入力された値を操作する必要がある場合に、おそらくより有用です。

ウィジェットの属性の変更に基づいて画面の再描画を簡単に強制できる GUI クラスでよく使用します。カスタム イベント システムのようなものです。

于 2013-03-29T16:16:18.233 に答える