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

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

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

      翻譯:《實用的Python編程》04_01_Class

      目錄 | 上一節 (3.6 設計討論) | 下一節 (4.2 繼承)

      4.1 類

      本節介紹 class 語句以及創建新對象的方式。

      面向對象編程(OOP)

      面向對象編程是一種將代碼組織成對象集合的編程技術。

      一個對象包括:

      • 數據。屬性
      • 行為。方法——應用于對象的函數。

      在本課程中,你已經使用了面向對象編程技術。

      例如,操作列表。

      >>> nums = [1, 2, 3]
      >>> nums.append(4)      # Method
      >>> nums.insert(1,10)   # Method
      >>> nums
      [1, 10, 2, 3, 4]        # Data
      >>>
      

      nums 是列表的實例(instance)。

      方法(append()insert())被綁定到實例(nums)上。

      class 語句

      使用 class 語句定義一個新的對象。

      class Player:
          def __init__(self, x, y):
              self.x = x
              self.y = y
              self.health = 100
      
          def move(self, dx, dy):
              self.x += dx
              self.y += dy
      
          def damage(self, pts):
              self.health -= pts
      

      簡而言之,類是一組函數,對所謂的 實例(instance) 執行各種操作。

      實例

      實例是你在程序中操作的實際對象。

      通過像調用函數一樣調用類來創建實例。

      >>> a = Player(2, 3)
      >>> b = Player(10, 20)
      >>>
      

      ab 都是 Player 類的實例。

      強調:class 語句僅僅是一個定義(它本身不執行任何操作)。類似于函數定義。

      實例數據

      每個實例都擁有自己的局部數據。

      >>> a.x
      2
      >>> b.x
      10
      

      數據通過 _init__() 方法進行初始化。

      class Player:
          def __init__(self, x, y):
              # Any value stored on `self` is instance data
              self.x = x
              self.y = y
              self.health = 100
      

      對屬性的總數或者類型沒有限制。

      實例方法

      應用于對象實例的函數稱為實例方法。

      class Player:
          ...
          # `move` is a method
          def move(self, dx, dy):
              self.x += dx
              self.y += dy
      

      對象本身始終作為第一個參數傳遞。

      >>> a.move(1, 2)
      
      # matches `a` to `self`
      # matches `1` to `dx`
      # matches `2` to `dy`
      def move(self, dx, dy):
      

      按照慣例,實例稱為 self。但是,使用的實際名字不重要。對象始終作為第一個參數傳遞。將這個參數稱為 self 只是 Python 的編程風格。

      類作用域

      類未定義名稱的作用域。

      class Player:
          ...
          def move(self, dx, dy):
              self.x += dx
              self.y += dy
      
          def left(self, amt):
              move(-amt, 0)       # NO. Calls a global `move` function
              self.move(-amt, 0)  # YES. Calls method `move` from above.
      

      如果想要對實例進行操作,那么你始終需要顯式地引用它(如: self)。

      練習

      從本組練習開始,我們將對前面章節的現有代碼進行一系列更改。從練習 3.18 版本的代碼開始非常重要。如果你還沒有這些代碼,請到 Solutions/3_18 目錄下查看,然后復制它。

      練習 4.1:把對象當做數據結構

      在第 2 和第 3 節中,我們使用了了以元組和字典表示的數據。例如,持有的股票可以用像下面這樣的元組表示:

      s = ('GOOG',100,490.10)
      

      或者使用像下面這樣的字典表示:

      s = { 'name'   : 'GOOG',
            'shares' : 100,
            'price'  : 490.10
      }
      

      你甚至可以編寫用于操作此類數據的函數。例如:

      def cost(s):
          return s['shares'] * s['price']
      

      但是,隨著程序規模的不斷擴大,你可能希望創建更好的代碼組織意識(sense)。因此,可以定義一個類表示數據。請創建一個名為 stock.py 的文件,并定義一個名為 Stock 的類,用以表示持有的單支股票。Stock 類具有 name, shares,和 price 屬性。示例:

      >>> import stock
      >>> a = stock.Stock('GOOG',100,490.10)
      >>> a.name
      'GOOG'
      >>> a.shares
      100
      >>> a.price
      490.1
      >>>
      

      創建更多的 Stock 對象并對其進行操作。示例:

      >>> b = stock.Stock('AAPL', 50, 122.34)
      >>> c = stock.Stock('IBM', 75, 91.75)
      >>> b.shares * b.price
      6117.0
      >>> c.shares * c.price
      6881.25
      >>> stocks = [a, b, c]
      >>> stocks
      [<stock.Stock object at 0x37d0b0>, <stock.Stock object at 0x37d110>, <stock.Stock object at 0x37d050>]
      >>> for s in stocks:
           print(f'{s.name:>10s} {s.shares:>10d} {s.price:>10.2f}')
      
      ... look at the output ...
      >>>
      

      需要強調的一點是,在這里, Stock 類充當創建實例對象的工廠。基本上,你可以像調用函數一樣調用類為你創建新對象。另外,必須強調的是,每一個對象都是不同的——它們擁有各自的數據,這些數據與以創建的其它對象是分開的。

      某種程度上,通過類定義的對象與字典類似——只是使用頗為不同的語法。例如,使用的是 s.names.price,而不是 s['name']s['price']

      練習 4.2:添加方法

      擁有對象后,你可以添加方法到對象上。眾所皆知,方法就是對存儲在對象內部的數據進行操作的函數。請給 Stock 對象添加 cost()sell() 方法。它們應該像下面這樣工作:

      >>> import stock
      >>> s = stock.Stock('GOOG', 100, 490.10)
      >>> s.cost()
      49010.0
      >>> s.shares
      100
      >>> s.sell(25)
      >>> s.shares
      75
      >>> s.cost()
      36757.5
      >>>
      

      練習 4.3:創建實例列表

      嘗試執行以下步驟,從列表字典中創建 Stock 的實例列表。然后計算總費用:

      >>> import fileparse
      >>> with open('Data/portfolio.csv') as lines:
      ...     portdicts = fileparse.parse_csv(lines, select=['name','shares','price'], types=[str,int,float])
      ...
      >>> portfolio = [ stock.Stock(d['name'], d['shares'], d['price']) for d in portdicts]
      >>> portfolio
      [<stock.Stock object at 0x10c9e2128>, <stock.Stock object at 0x10c9e2048>, <stock.Stock object at 0x10c9e2080>,
       <stock.Stock object at 0x10c9e25f8>, <stock.Stock object at 0x10c9e2630>, <stock.Stock object at 0x10ca6f748>,
       <stock.Stock object at 0x10ca6f7b8>]
      >>> sum([s.cost() for s in portfolio])
      44671.15
      >>>
      

      練習 4.4:使用類

      請修改 report.py 程序里面的 read_portfolio() 函數,以便如練習 4.3 所示那樣,讀取股票投資組合到 Stock 的實例列表里面。修改完后,修復(fix)report.pypcost.py 里面所有的代碼,以便使用 Stock 的實例進行工作,而不是使用字典。

      提示:你不必對代碼進行大量更改,主要是將字典訪問,如 s['shares'] 更改為 s.shares

      修改完后應該能夠像之前一樣運行函數:

      >>> import pcost
      >>> pcost.portfolio_cost('Data/portfolio.csv')
      44671.15
      >>> import report
      >>> report.portfolio_report('Data/portfolio.csv', 'Data/prices.csv')
            Name     Shares      Price     Change
      ---------- ---------- ---------- ----------
              AA        100       9.22     -22.98
             IBM         50     106.28      15.18
             CAT        150      35.46     -47.98
            MSFT        200      20.89     -30.34
              GE         95      13.48     -26.89
            MSFT         50      20.89     -44.21
             IBM        100     106.28      35.84
      >>>
      

      目錄 | 上一節 (3.6 設計討論) | 下一節 (4.2 繼承)

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

      posted @ 2021-03-07 14:37  codists  閱讀(301)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产一区二区在线有码| 52熟女露脸国语对白视频| 丰满多毛的大隂户视频| 26uuu另类亚洲欧美日本| 亚洲天堂在线观看完整版| 欧美乱大交aaaa片if| 久热这里只有精品12| 国产精品嫩草99av在线| 日本真人添下面视频免费| 成人看的污污超级黄网站免费| 欧美人与动牲交a免费| 亚洲的天堂在线中文字幕| 男女扒开双腿猛进入爽爽免费看| 白丝乳交内射一二三区| 精品综合一区二区三区四区| 国产成人一区二区三区免费| 亚洲日韩久热中文字幕| 欧美性xxxxx极品| 激情 自拍 另类 亚洲| av午夜福利一片免费看久久| 日韩精品一区二区都可以| 国产剧情福利一区二区麻豆| 野花在线观看免费观看高清| 中文字幕理伦午夜福利片| 国产一级黄色片在线播放| 一区二区三区四区黄色网| 无码国模国产在线观看免费| 国产l精品国产亚洲区| 久久久久影院色老大2020| 福利一区二区视频在线| 高清精品一区二区三区| 亚洲国产成人久久一区久久| 国产精品自在自线免费观看| 磐石市| 一本一本久久a久久综合精品| 国产偷自视频区视频| 欧美综合区自拍亚洲综合绿色| 亚洲国产精品日韩在线| 午夜一区二区三区视频| 国产AV福利第一精品| 成人av一区二区亚洲精|