ホームページ  >  記事  >  バックエンド開発  >  Python の属性記述子の詳細な紹介 (コード例)

Python の属性記述子の詳細な紹介 (コード例)

不言
不言転載
2018-12-12 10:37:112823ブラウズ

この記事では、Python の属性記述子について詳しく紹介 (コード例) しています。一定の参考値があります。困っている友人は参考にしてください。お役に立てれば幸いです。

初心者として、私は毎日何かを読んで知識を勉強しています。今日は、良いものを紹介したいと思います-属性記述子

属性記述子とは何ですか?

実際、クラスに実装された set__、__get__、__delete のマジック関数はすべて属性記述子です。

次に、属性記述子を定義します。

class IntegerField:
    def __get__(self, instance, owner):
        pass
    def __set__(self, instance, value):
        pass
    def __delete__(self, instance):
        pass
class User:
    high= IntField()

__get__: この属性をクラスまたはインスタンスで呼び出すと、__get__ 関数の結果が返されます。
__set__: Python は、Instance を使用して属性値を設定するときにこの関数を呼び出します。クラスに制限はありません。
__delete__: インスタンスを使用して属性を削除しようとすると、Python はこの関数を呼び出します。クラスに制限はありません。
これはどうやって使うのですか?次に、属性記述子を使用して属性に特定のロジックを付加できるように、上記のコードを全員に向けて変更します (

class IntegerField:
    def __get__(self, instance, owner):
        return self.value
    def __set__(self, instance, value):
        if not isinstance(value,numbers.Integral):
            raise ValueError("请输入一个整数")
        self.value=value
        
    def __delete__(self, instance):
        pass
class User:
    high=IntegerField() 
#验证代码
if __name__ == '__main__':
    user=User()
    user.high='175'    #报错,ValueError:请输入一个整数
    User.high=175    #正确执行,不报错

)。
実際には、属性記述子の下で、
1. データ記述子: __set__、__get__

if __name__ == '__main__':
    user=User()
    user.high=175
    print(user.__dict__)    #high是不放入__dict__中的,优先查找数据描述符中的值
    user.__dict__["high"]="abc"    #这样赋值时可以的,并且可以放入__dict__中
    print(user.high)    #会报错,因为在调用__get__方法时并没有value属性

を実装します。非データ: __get__ を実装しますが、__set____ は実装しません

リーリー

#

以上がPython の属性記述子の詳細な紹介 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。