まず、属性の定義を見てみましょう
属性の定義:pythonの属性は、実際には一般的なメソッドから派生しています。
クラス属性を操作する方法は3つあります。
@propertyデコレータを使用して、クラスプロパティを操作します。
クラスまたはインスタンスを使用して、クラス属性を直接操作します(例:obj.name、obj.age = 18、del obj.age)
python組み込み関数を使用して属性を操作します。
属性の存在の意味:
1、 属性にアクセスするとき、フィールドにアクセスするのと同じ錯覚を作り出すことができます。属性はメソッドから派生します。Pythonに属性がない場合、メソッドはその機能を完全に置き換えることができます。
2、 属性を定義すると、特定の属性値を動的に取得できます。属性値は、属性の対応するメソッドによって実現されるため、アプリケーションがより柔軟になります。
3、 独自の属性ルールを作成して、他の人が属性値を自由に変更できないようにすることができます。
以下では、クラス属性を操作する3つのメソッドについて詳しく説明します。
定義するときは、通常のメソッドに基づいて@propertyデコレータを追加します。プロパティにはselfパラメータが1つしかないため、呼び出すときに括弧は必要ありません。
利点:
@ プロパティデコレータは、他の言語が持つゲッター、セッター、デリッターの機能を実装できます(たとえば、非表示のプロパティを取得、設定、削除するため)
@propertyデコレータは、プロパティの値と割り当てを制御し、コードの安定性を向上させることができます。
コード例1:
# encoding=utf-8classGoods(): #新しいスタイル
@ property
def price(self): #属性値を表示
print('@property ')
@ price.setter #属性を変更および設定する
def price(self, value):print('@price.setter')
@ price.deleter#属性を削除
def price(self):print('@price.deleter')
obj =Goods(50)
obj.price#自動実行@プロパティ変更価格メソッドとメソッドの戻り値を取得します
obj.price =2000 #自動実行@price.セッター修正価格メソッド、およびメソッドパラメーターに2000を割り当てます
del obj.price #自動実行@price.削除者修正価格法
結果出力:
@ property
@ price.setter
@ price.deleter
コード例2:@propertyデコレータを使用して、プロパティの値と割り当てを制御します
classGoods(object):
def __init__(self):
self.value=50
@ property
def price(self): #プロパティを表示
return self.value
@ price.setter #属性(属性名)を追加または設定します.setter)
def price(self, value):if value =50 and value<=100: #属性の値と割り当てを制御する
self.value=value
print(self.value)else:print("50から100までの数字を入力してください!")
@ price.deleter #属性(属性名)を削除します.deleter)注:属性が削除されると、設定および取得できなくなります
def price(self):
del self.value
print("price is deleted!")
obj =Goods()print(obj.price) #自動実行@プロパティ変更価格メソッドとメソッドの戻り値を取得します
obj.price=106 #自動実行@price.セッター修正価格メソッド、およびメソッドに106を割り当てます
del obj.price #自動実行@price.削除者修正価格法
結果出力:
50
50から100までの数字を入力してください!
price is deleted!
拡張の例:
classDog(object):
name ='dog'
def init(self):
self.age =18
d1 =Dog()
d2 =Dog()
d1とd2の2つの例を次に示します。
d1.name #出力dogd2.name #出力dogd1.name ='abc'
d1.name #出力abcd2.name #dogDogを出力します.name #出力犬
その理由は、d1.nameがdogを出力するのは、このインスタンスがclass属性を共有しているからではなく、このインスタンスにdog属性がないため、pythonがclass属性を検索するためです。ただし、name属性をd1インスタンスにバインドすることと同等のd1.nameを変更すると、d1.nameはclass属性とは何の関係もありません。この場合、値が割り当てられている限り、属性をバインドすることと同等であるため、インスタンス間でクラス属性を共有することについて話すことはできません。上記のd1.nameとd2.nameの意味は異なり、それらの値も異なります。彼らのデータが共有されていないことは明らかです。
これまでのところ、pythonクラス属性とは何かに関するこの記事が紹介されています。関連するpythonクラス属性については、ZaLou.Cnの以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後、ZaLou.Cnをさらにサポートしていただければ幸いです。 !
Recommended Posts