python propertyプロパティの詳細
7653 ワード
propertyプロパティ propertyプロパティ とは
使用するインスタンス属性のような特殊な属性で、ある方法に対応することができる.
##############定義
class Foo: def func(self): pass
#############呼び出し
foo_obj = Foo() foo_obj.func()呼び出しインスタンスメソッドfoo_obj.prop#呼び出しpropertyプロパティ
propertyプロパティの定義と呼び出しには、次の点に注意してください.の簡単な例は、京東商城にコンピュータホストのリストページが表示される場合、要求されるたびにデータベースのすべての内容をページに表示するのではなく、ページ分割機能によってローカルに表示することはできません.したがって、データベースにデータを要求するときに表示される指定は、m番目からn番目までのすべてのデータを取得するこのページング機能には、 が含まれる.
##############定義
class Pager:def init(self,current_page):#ユーザーが現在要求しているページ番号(第1ページ、第2ページ...)self.current_page=current_page#各ページにデフォルトで10個のデータself.per_items=10が表示されます
#############呼び出し
p=Pager(1)p.start#が開始値、すなわち、m p.end#が終了値、すなわち、n
上から見える propertyプロパティには、2つの方法でモディファイヤクラスプロパティを適用する、すなわち、クラスで定義値がpropertyオブジェクトのクラスプロパティ がある.
3.1装飾器方式
クラスのインスタンスメソッドに@property装飾器を適用する
Pythonのクラスには古典クラスと新式クラスがあり,新式クラスの属性は古典クラスの属性より豊富である.(クラスがobjectに続く場合、このクラスは新しいクラス)クラシッククラスであり、@property装飾器を有する
##############定義
class Goods: @property def price(self): return “laowang”
#############呼び出し
obj = Goods() result = obj.price#@property修飾のpriceメソッドを自動的に実行し、メソッドの戻り値print(result)を取得します.
新しいクラス、3種類の@property装飾器を備えています
#coding=utf-8
##############定義
class Goods:"""python 3でobjectクラスをデフォルトで継承してpython 2、3でこのプログラムを実行した結果は異なります.python 3でのみ@[email protected]""@property def price(self):print('@property')があるためです.
#############呼び出し
obj = Goods() obj.price#は@property修飾のpriceメソッドを自動的に実行し、メソッドの戻り値objを取得する.price=123#自動実行@price.setter修飾priceメソッドは、メソッドのパラメータdel objに123を付与.price#自動実行@price.deleter修飾のpriceメソッド
に注意
新しいクラスには3つのアクセス方法があるため、これらのいくつかのプロパティのアクセス特徴に基づいて、同じプロパティの取得、変更、削除の3つのメソッドをそれぞれ定義できます.
class Goods(object):
obj = Goods() obj.price#商品価格objを取得する.price=200#商品原価del objを修正する.price#商品原価の削除
3.2クラス属性方式、propertyオブジェクトの値を持つクラス属性を作成する
class Foo: def get_bar(self): return ‘laowang’
obj = Foo() reuslt = obj.BAR#自動呼び出しget_barメソッド、メソッドの戻り値print(reuslt)を取得
propertyメソッドには4つのパラメータがあります
#coding=utf-8 class Foo(object): def get_bar(self): print(“getter…”) return ‘laowang’
obj = Foo()
obj.BAR#は、最初のパラメータで定義されたメソッドを自動的に呼び出します:get_bar obj.BAR="alex"#2番目のパラメータで定義されたメソッドを自動的に呼び出す:set_barメソッドは、「alex」をパラメータとしてdesc=Fooに入力.BAR.doc#は、4番目のパラメータで設定する値を自動的に取得します:description...print(desc)del obj.BAR#3番目のパラメータで定義されたメソッドを自動的に呼び出す:del_barメソッド
クラス属性方式property属性の作成には3つのアクセス方式があるため、それらのいくつかの属性のアクセス特徴に基づいて、それぞれ3つの方法を同じ属性:取得、修正、削除と定義することができます.
class Goods(object):
obj = Goods() obj.PRICE#商品価格obj.PRICE=200#商品原価del objを修正する.PRICE#商品原価の削除 Djangoフレームワークにpropertyプロパティ(了解) が適用されています.
WEBフレームDjangoのビューでrequest.POSTとは、使用するクラス属性の方式で作成される属性である
class WSGIRequest(http.HttpRequest): def init(self, environ): script_name = get_script_name(environ) path_info = get_path_info(environ) if not path_info: # Sometimes PATH_INFO exists, but is empty (e.g. accessing # the SCRIPT_NAME URL without a trailing slash). We really need to # operate as if they’d requested ‘/’. Not amazingly nice to force # the path like this, but should be harmless. path_info = ‘/’ self.environ = environ self.path_info = path_info self.path = ‘%s/%s’ % (script_name.rstrip(’/’), path_info.lstrip(’/’)) self.META = environ self.META[‘PATH_INFO’] = path_info self.META[‘SCRIPT_NAME’] = script_name self.method = environ[‘REQUEST_METHOD’].upper() _, content_params = cgi.parse_header(environ.get(‘CONTENT_TYPE’, ‘’)) if ‘charset’ in content_params: try: codecs.lookup(content_params[‘charset’]) except LookupError: pass else: self.encoding = content_params[‘charset’] self._post_parse_error = False try: content_length = int(environ.get(‘CONTENT_LENGTH’)) except (ValueError, TypeError): content_length = 0 self._stream = LimitedStream(self.environ[‘wsgi.input’], content_length) self._read_started = False self.resolver_match = None
以上より、
使用するインスタンス属性のような特殊な属性で、ある方法に対応することができる.
##############定義
class Foo: def func(self): pass
# property
@property
def prop(self):
pass
#############呼び出し
foo_obj = Foo() foo_obj.func()呼び出しインスタンスメソッドfoo_obj.prop#呼び出しpropertyプロパティ
propertyプロパティの定義と呼び出しには、次の点に注意してください.
, @property ; self
,
:foo_obj.func()
property :foo_obj.prop
m n
m n
##############定義
class Pager:def init(self,current_page):#ユーザーが現在要求しているページ番号(第1ページ、第2ページ...)self.current_page=current_page#各ページにデフォルトで10個のデータself.per_items=10が表示されます
@property
def start(self):
val = (self.current_page - 1) * self.per_items
return val
@property
def end(self):
val = self.current_page * self.per_items
return val
#############呼び出し
p=Pager(1)p.start#が開始値、すなわち、m p.end#が終了値、すなわち、n
上から見える
Python property :property , 。
3.1装飾器方式
クラスのインスタンスメソッドに@property装飾器を適用する
Pythonのクラスには古典クラスと新式クラスがあり,新式クラスの属性は古典クラスの属性より豊富である.(クラスがobjectに続く場合、このクラスは新しいクラス)クラシッククラスであり、@property装飾器を有する
##############定義
class Goods: @property def price(self): return “laowang”
#############呼び出し
obj = Goods() result = obj.price#@property修飾のpriceメソッドを自動的に実行し、メソッドの戻り値print(result)を取得します.
新しいクラス、3種類の@property装飾器を備えています
#coding=utf-8
##############定義
class Goods:"""python 3でobjectクラスをデフォルトで継承してpython 2、3でこのプログラムを実行した結果は異なります.python 3でのみ@[email protected]""@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() obj.price#は@property修飾のpriceメソッドを自動的に実行し、メソッドの戻り値objを取得する.price=123#自動実行@price.setter修飾priceメソッドは、メソッドのパラメータdel objに123を付与.price#自動実行@price.deleter修飾のpriceメソッド
に注意
, @property
, @property、@ .setter、@ .deleter
新しいクラスには3つのアクセス方法があるため、これらのいくつかのプロパティのアクセス特徴に基づいて、同じプロパティの取得、変更、削除の3つのメソッドをそれぞれ定義できます.
class Goods(object):
def __init__(self):
#
self.original_price = 100
#
self.discount = 0.8
@property
def price(self):
# = *
new_price = self.original_price * self.discount
return new_price
@price.setter
def price(self, value):
self.original_price = value
@price.deleter
def price(self):
del self.original_price
obj = Goods() obj.price#商品価格objを取得する.price=200#商品原価del objを修正する.price#商品原価の削除
3.2クラス属性方式、propertyオブジェクトの値を持つクラス属性を作成する
property ,
class Foo: def get_bar(self): return ‘laowang’
BAR = property(get_bar)
obj = Foo() reuslt = obj.BAR#自動呼び出しget_barメソッド、メソッドの戻り値print(reuslt)を取得
propertyメソッドには4つのパラメータがあります
, .
, . = XXX
, del .
, . .__doc__ ,
#coding=utf-8 class Foo(object): def get_bar(self): print(“getter…”) return ‘laowang’
def set_bar(self, value):
""" """
print("setter...")
return 'set value' + value
def del_bar(self):
print("deleter...")
return 'laowang'
BAR = property(get_bar, set_bar, del_bar, "description...")
obj = Foo()
obj.BAR#は、最初のパラメータで定義されたメソッドを自動的に呼び出します:get_bar obj.BAR="alex"#2番目のパラメータで定義されたメソッドを自動的に呼び出す:set_barメソッドは、「alex」をパラメータとしてdesc=Fooに入力.BAR.doc#は、4番目のパラメータで設定する値を自動的に取得します:description...print(desc)del obj.BAR#3番目のパラメータで定義されたメソッドを自動的に呼び出す:del_barメソッド
クラス属性方式property属性の作成には3つのアクセス方式があるため、それらのいくつかの属性のアクセス特徴に基づいて、それぞれ3つの方法を同じ属性:取得、修正、削除と定義することができます.
class Goods(object):
def __init__(self):
#
self.original_price = 100
#
self.discount = 0.8
def get_price(self):
# = *
new_price = self.original_price * self.discount
return new_price
def set_price(self, value):
self.original_price = value
def del_price(self):
del self.original_price
PRICE = property(get_price, set_price, del_price, ' ...')
obj = Goods() obj.PRICE#商品価格obj.PRICE=200#商品原価del objを修正する.PRICE#商品原価の削除
WEBフレームDjangoのビューでrequest.POSTとは、使用するクラス属性の方式で作成される属性である
class WSGIRequest(http.HttpRequest): def init(self, environ): script_name = get_script_name(environ) path_info = get_path_info(environ) if not path_info: # Sometimes PATH_INFO exists, but is empty (e.g. accessing # the SCRIPT_NAME URL without a trailing slash). We really need to # operate as if they’d requested ‘/’. Not amazingly nice to force # the path like this, but should be harmless. path_info = ‘/’ self.environ = environ self.path_info = path_info self.path = ‘%s/%s’ % (script_name.rstrip(’/’), path_info.lstrip(’/’)) self.META = environ self.META[‘PATH_INFO’] = path_info self.META[‘SCRIPT_NAME’] = script_name self.method = environ[‘REQUEST_METHOD’].upper() _, content_params = cgi.parse_header(environ.get(‘CONTENT_TYPE’, ‘’)) if ‘charset’ in content_params: try: codecs.lookup(content_params[‘charset’]) except LookupError: pass else: self.encoding = content_params[‘charset’] self._post_parse_error = False try: content_length = int(environ.get(‘CONTENT_LENGTH’)) except (ValueError, TypeError): content_length = 0 self._stream = LimitedStream(self.environ[‘wsgi.input’], content_length) self._read_started = False self.resolver_match = None
def _get_scheme(self):
return self.environ.get('wsgi.url_scheme')
def _get_request(self):
warnings.warn('`request.REQUEST` is deprecated, use `request.GET` or '
'`request.POST` instead.', RemovedInDjango19Warning, 2)
if not hasattr(self, '_request'):
self._request = datastructures.MergeDict(self.POST, self.GET)
return self._request
@cached_property
def GET(self):
# The WSGI spec says 'QUERY_STRING' may be absent.
raw_query_string = get_bytes_from_wsgi(self.environ, 'QUERY_STRING', '')
return http.QueryDict(raw_query_string, encoding=self._encoding)
# ############### ###############
def _get_post(self):
if not hasattr(self, '_post'):
self._load_post_and_files()
return self._post
# ############### ###############
def _set_post(self, post):
self._post = post
@cached_property
def COOKIES(self):
raw_cookie = get_str_from_wsgi(self.environ, 'HTTP_COOKIE', '')
return http.parse_cookie(raw_cookie)
def _get_files(self):
if not hasattr(self, '_files'):
self._load_post_and_files()
return self._files
# ############### ###############
POST = property(_get_post, _set_post)
FILES = property(_get_files)
REQUEST = property(_get_request)
以上より、
property , 【 】 【 】, 【 】 。
property ,