pythonアドバンスドステップ_3_ @property装飾器の意味01


この章ではほとんどの人が@propertyの役割を理解しています.メソッドを属性に変換して、直接値を付けることができるのではないでしょうか.
では、なぜこのようにするのは何の意味があるのでしょうか.
まずコードで少しずつ起動します.1.直接値を与えないで、検査を迂回する
class Student:
    def __init__(self,name,age):
        self.name=name
        self.age=age


stu=Student("Lady",50)
prtint(stu.age)
stu.age=120
print(stu.age)

印刷結果:
50
120

以上の結果から,ageを任意に読み取り修正でき,設定したageは年齢規範に合致しない.これは明らかにだめだ.まず,メソッドで検証し,プロパティを作成し,メソッドで取得することを考えた.
class Student:
    def __init__(self,name):
        self.name=name
    def set_age(self,age):
        if isinstance(age,int):
            if 0

印刷結果;
120

上のコードの仲間は言うべきで、私は方法を使わなくても値を修正することができます、stu.age=120は間違っていませんよ.
この理由を説明するために、再びオブジェクトを作成してこのプロパティを直接印刷します.
stu02=Student('gaga')
print(stu02.age)

エラーは次のとおりです.
 'Student' object has no attribute 'age'

ポイントを間違えないのはstuです.age=120このステップはインスタンス化オブジェクトです.stuは自分でage属性を追加したので、エラーは報告されません.このプロパティはstuに属しているだけで、インスタンスを変えて印刷しても間違いが発生します.少し話が多くなって、軌道に戻り始めた.
class Student:
    def __init__(self,name):
        self.name=name
    def set_age(self,age):
        if isinstance(age,int):
            if 0

印刷結果:
         
10
10

どちらの方法もageを取ることができます.その仲間はget方法を書く必要はありません.stuを直接使うべきです.age呼び出しでいいです(setメソッドの戻り値を直接使用します).
このような状況の発生を防止するために、規範は以下の通りである.setメソッドで返される属性名の前に_を付けると、小さな短線.(実際には避けられないが、相対的に安全)だからこう書いてある.
class Student:
    def __init__(self,name):
        self.name=name
    def set_age(self,age):
        if isinstance(age,int):
            if 0

これでいいです.2.@propertyを適用すると、呼び出しの方法を呼び出し属性のように直接使用できます.
Pythonに内蔵されている@property装飾器は、メソッドをプロパティ呼び出しに変更する責任を負います.
class Student:
    def __init__(self,name):
        self.name=name

    @property
    def age(self):
        return self._age
    @age.setter
    def age(self,age):
        if isinstance(age,int):
            if 0

上の主な点は以下の通りです.getとsetのメソッド名は同じ(age)2.setメソッドが返すプロパティに「」を付ける3.@propertyはgetメソッド[email protected]はsetメソッドに対して、@property自体が別の装飾器5を作成する.直接できるage=10オブジェクト名.メソッド名は付与され、6.getterメソッドのみを定義し、setterメソッドを定義しないのは読み取り専用プロパティの下でこのプロパティを説明します.
3.getterメソッドのみを定義し、setterメソッドを定義しないのは読み取り専用属性です.
class Student:
    def __init__(self,name):
        self.name=name

    @property
    def age(self):
        return self._age
    @age.setter
    def age(self,age):
        if isinstance(age,int):
            if 0

印刷結果:
10
Traceback (most recent call last):
  File "D:/works/Unittest/test.py", line 26, in 
    stu.after_3=5
AttributeError: can't set attribute

しかし、次のように読み取ることができます.
print(stu.after_3)

印刷結果:
13