python propertyプロパティの詳細

7653 ワード

propertyプロパティ
  • propertyプロパティ
  • とは
    使用するインスタンス属性のような特殊な属性で、ある方法に対応することができる.
    ##############定義
    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
    
       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              ,         。
    
  • 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')があるためです.
    @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#商品原価の削除
  • 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
    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  ,