<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      翻譯:《實用的Python編程》07_05_Decorated_methods

      目錄 | 上一節 (7.4 裝飾器) | 下一節 (8 測試和調試)

      7.5 裝飾方法

      本節討論一些與方法定義結合使用的內置裝飾器。

      預定義的裝飾器

      在類定義中,有許多預定義的裝飾器用于指定特殊類型的方法。

      class Foo:
          def bar(self,a):
              ...
      
          @staticmethod
          def spam(a):
              ...
      
          @classmethod
          def grok(cls,a):
              ...
      
          @property
          def name(self):
              ...
      

      讓我們逐個查看吧。

      靜態方法

      @staticmethod 用于定義所謂的靜態類方法( static class method,來自于 C++/Java)。靜態方法是一個函數,這個函數是類的一部分,但不是在實例上進行操作。

      class Foo(object):
          @staticmethod
          def bar(x):
              print('x =', x)
      
      >>> Foo.bar(2) 
      x=2
      >>>
      

      靜態方法有時用于實現類的內部支持代碼,例如,用于幫助管理已創建的實例(內存管理,系統資源,持久化,鎖等等)。有時也用于某些設計模式(這里暫不討論)。

      類方法

      @classmethod 用于定義類方法(class methods)。類方法是一種將 對象而不是實例作為第一個參數的方法。

      class Foo:
          def bar(self):
              print(self)
      
          @classmethod
          def spam(cls):
              print(cls)
      
      >>> f = Foo()
      >>> f.bar()
      <__main__.Foo object at 0x971690>   # The instance `f`
      >>> Foo.spam()
      <class '__main__.Foo'>              # The class `Foo`
      >>>
      

      類方法常用作定義替代構造函數(constructor)的工具。

      import time
      class Date:
          def __init__(self,year,month,day):
              self.year = year
              self.month = month
              self.day = day
      
          @classmethod
          def today(cls):
              # Notice how the class is passed as an argument
              tm = time.localtime()
              # And used to create a new instance
              return cls(tm.tm_year, tm.tm_mon, tm.tm_mday)
      
      d = Date.today()
      

      類方法可以和繼承等特性一起使用以解決棘手的問題。

      class Date:
          ...
          @classmethod
          def today(cls):
              # Gets the correct class (e.g. `NewDate`)
              tm = time.localtime()
              return cls(tm.tm_year, tm.tm_mon, tm.tm_mday)
      
      class NewDate(Date):
          ...
      
      d = NewDate.today()
      

      練習

      練習 7.11:實踐中的類方法

      report.pyportfolio.py 文件中, Portfolio 類的創建稍微有點混亂。例如,report.py 程序具有如下代碼:

      def read_portfolio(filename, **opts):
          '''
          Read a stock portfolio file into a list of dictionaries with keys
          name, shares, and price.
          '''
          with open(filename) as lines:
              portdicts = fileparse.parse_csv(lines,
                                              select=['name','shares','price'],
                                              types=[str,int,float],
                                              **opts)
      
          portfolio = [ Stock(**d) for d in portdicts ]
          return Portfolio(portfolio)
      

      portfolio.py 文件中定義的 Portfolio 具有一個奇怪的初始化:

      class Portfolio:
          def __init__(self, holdings):
              self.holdings = holdings
          ...
      

      坦白說,因為代碼分散在各文件中,所以責任鏈稍微有點混亂。如果 Portfolio 類應該包含 Stock 類的實例列表,那么你應該修改該類以使其更清晰。示例:

      # portfolio.py
      
      import stock
      
      class Portfolio:
          def __init__(self):
              self.holdings = []
      
          def append(self, holding):
              if not isinstance(holding, stock.Stock):
                  raise TypeError('Expected a Stock instance')
              self.holdings.append(holding)
          ...
      

      如果想要從 CSV 文件中讀取投資組合數據,那么你也許應該為此創建一個類方法:

      # portfolio.py
      
      import fileparse
      import stock
      
      class Portfolio:
          def __init__(self):
              self.holdings = []
      
          def append(self, holding):
              if not isinstance(holding, stock.Stock):
                  raise TypeError('Expected a Stock instance')
              self.holdings.append(holding)
      
          @classmethod
          def from_csv(cls, lines, **opts):
              self = cls()
              portdicts = fileparse.parse_csv(lines,
                                              select=['name','shares','price'],
                                              types=[str,int,float],
                                              **opts)
      
              for d in portdicts:
                  self.append(stock.Stock(**d))
      
              return self
      

      要使用新的 Portfolio 類,你可以這樣編寫代碼:

      >>> from portfolio import Portfolio
      >>> with open('Data/portfolio.csv') as lines:
      ...     port = Portfolio.from_csv(lines)
      ...
      >>>
      

      請對 Portfolio 類進行修改,然后修改 report.py 的代碼以使用類方法。

      目錄 | 上一節 (7.4 裝飾器) | 下一節 (8 測試和調試)

      注:完整翻譯見 https://github.com/codists/practical-python-zh

      posted @ 2021-04-07 14:09  codists  閱讀(140)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲欧美在线观看品| 久久国产精品老人性| 国产熟女激情一区二区三区| 欧洲亚洲精品免费二区| 国产高清视频一区二区三区 | 亚洲色丰满少妇高潮18p| 午夜在线欧美蜜桃| 老湿机69福利区无码| 免费久久人人香蕉av| 欧美乱大交aaaa片if| 亚洲乱码精品久久久久..| 97国产揄拍国产精品人妻| 久久99国产精品久久99小说| 神农架林区| 亚洲中文字幕无码av永久| 人妻影音先锋啪啪AV资源| 在线日韩日本国产亚洲| 欧美成人精品手机在线| 18岁日韩内射颜射午夜久久成人| 亚洲第一福利网站在线观看 | 中国少妇嫖妓BBWBBW| 自贡市| 国产成人永久免费av在线| 在国产线视频A在线视频| 国产精品丝袜一区二区三区| 精品午夜福利无人区乱码| 久久蜜臀av一区三区| japanese无码中文字幕| 亚洲国产精品综合久久20| 国产99精品成人午夜在线| 国产av亚洲精品ai换脸电影| 国产av亚洲精品ai换脸电影| 亚洲乱女色熟一区二区三区| 强d乱码中文字幕熟女1000部| 国精无码欧精品亚洲一区| 国产精品∧v在线观看| 色噜噜亚洲男人的天堂| 成人免费区一区二区三区| 人人妻碰人人免费| 亚洲V天堂V手机在线| 封丘县|