この記事では、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 サイトの他の関連記事を参照してください。