亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

Python語言的面相對象編程方式初步學習

2020-01-04 17:38:08
字體:
來源:轉載
供稿:網友
這篇文章主要介紹Python語言的面相對象編程方式的初步學習,包括類和對象以及繼承特性等知識,需要的朋友可以參考下
 

詞語練習

  • class:告訴python創造一個新的東西
  • object:兩個意思:最基本的東西和任何實例化的東西。
  • instance:創建一個類得到的東西。
  • def:在類中創建一個函數。
  • self:在類里面的函數中使用,是實例和object能訪問的變量。
  • inheritance:繼承,一個類可以繼承另一個類,像你和你的父母。
  • composition:一個類可以包含另外一個類,就像汽車包含輪胎。
  • attribute:一個屬性類,通常包括變量。
  • is-a:表示繼承關系
  • has-a:包含關系

通過卡片記憶這些詞語,單獨的詞語通常沒什么意義,不過我還是要先知道它們的存在。

短語練習

  • class x(y):創建一個類x,它繼承了y類。
  • class x(object):def __init__(self,j):x類包含__init__函數,函數中有self和j參數。
  • class x(object):def m(self,j):類x包含m函數,m函數有self和j兩個參數。
  • foo = x():設置foo為類x的實例化。
  • foo.m(j):通過foo調用m函數,參數是self和j。
  • foo.k = q:通過foo給k屬性賦值為q。

上面那些x,y,m,q等等都是可以變的。

一個閱讀測試
這是一個簡單的腳本可以讓你用來做練習,它只做一件事,就是使用一個urllib的庫去下載一個單詞列表。我們把下面的代碼寫到opp_test.py文件中。

import random from urllib import urlopen import sys   WORD_URL = "http://learncodethehardway.org/words.txt" WORDS = []   PHRASES = {   "class ###(###):": "Make a class named ### that is-a ###.",   "class ###(object):/n/tdef __init__(self, ***)" : "class ### has-a __init__ that takes self and *** parameters.",   "class ###(object):/n/tdef ***(self, @@@)": "class ### has-a function named *** that takes self and @@@ parameters.",   "*** = ###()" : "Set *** to an instance of class ###.",   "***.***(@@@)" : "From *** get the *** function, and call it with parameters self, @@@.",   "***.*** = '***'": "From *** get the *** attribute and set it to '***'." }   PHRASE_FIRST = False if len(sys.argv) == 2 and sys.argv[1] == "english":   PHRASE_FIRST = True   for word in urlopen(WORD_URL).readlines():   WORDS.append(word.strip())   def convert(snippet, phrase):   class_names = [w.capitalize() for w in random.sample(WORDS, snippet.count("###"))]   other_names = random.sample(WORDS, snippet.count("***"))   results = []   param_names = []     for i in range(0, snippet.count("@@@")):     param_count = random.randint(1, 3)     param_names.append(', '.join(random.sample(WORDS, param_count)))     for sentence in snippet, phrase:     result = sentence[:]       # fake class names     for word in class_names:       result = result.replace("###", word, 1)       # fake other names     for word in other_names:       result = result.replace("***", word, 1)       # fake parameter lists     for word in param_names:       result = result.replace("@@@", word, 1)       results.append(result)     return results   try:   while True:     snippets = PHRASES.keys()     random.shuffle(snippets)       for snippet in snippets:       phrase = PHRASES[snippet]       question, answer = convert(snippet, phrase)       if PHRASE_FIRST:         question, answer = answer, question         print question         raw_input("> ")       print "ANSWER: %s/n/n" % answer except EOFError:   print "/nBye" 


運行這個例子,它會盡可能準確的回答問題。

root@he-desktop:~/mystuff# python oop_test.py 
class Deer(object):def __init__(self, connection)> ANSWER: class Deer has-a __init__ that takes self and connection parameters.class Cause(Agreement):> ANSWER: Make a class named Cause that is-a Agreement.animal.driving(arch)> ANSWER: From animal get the driving function, and call it with parameters self, arch.cat = Aftermath()> ANSWER: Set cat to an instance of class Aftermath.cork.card = 'attempt'> 


類和對象
類就像模塊

你可以認為模塊就是一個特殊的字典,它可以保存python代碼,通過 . 號調用。python還有一個類似實現這種目的的結構,叫做類。一個類包含了很多函數和數據,可以通過 . 去訪問它們。

如果我要寫一個類似mystuff的類,就像這樣:

class mystuff(object):  def __int__(self):    self.tangerine = "Hello"  def apple(self):    print "apple"

和模塊比有點復雜,不過你可以認為它就是一個迷你模塊。讓人疑惑的是__init__()函數和self.tangerine設置tangerine變量的值。

這里是用類替代模塊的原因:你可以在一個程序中使用同一個類很多次,它們不相互影響,但是一個程序中只能導入一個模塊。

理解這些之前,你必須理解什么是對象。

對象就像迷你的導入
如果類像模塊,那么類也會有類型模塊的導入功能。就是實例化,如果你實例化一個類,得到的就是一個對象。

使用類的方法類似調用函數,像這樣:

thing = mystuff()thing.apple()print thing.tangerine

第一步是實例化,然后調用它的函數,我們通過上面的代碼分析一下python是怎么按照順序執行的:

  • python尋找Myclass,看看你是不是定義了這個類。
  • python為你在類里面定義的函數創建一個空對象。
  • 如果類中有魔術方法__init__,那么就會使用這個函數初始化你的空對象。
  • 在__init__方法中有一個額外的變量self,這就是python為我們創建的空對象,你可以給這個變量賦值。
  • 這樣的話,我給 thing.tangerine賦了句歌詞,并且初始化了這個對象。
  • 那么現在python就可以把這個剛完成的對象賦給一個變量thing了。

這就是我們為什么像調用函數一樣導入一個類。

記住,我給出的不是一個非常準確類的工作方法,僅僅是為了你能通過模塊而更好的理解類。事實是,類和對象和模塊不是一個東西,老實說的話,就像下面這樣:

  • 類就像一個藍圖,定義用來創建一個迷你模塊。
  • 實例化就是導入的同時使用這個迷你模塊。
  • 創建出來的迷你模塊就是對象,賦給一個變量,然后通過這個變量工作。
  • 雖然從模塊過渡到類和對象比較難,不過也只有這個方法比較好理解。

從東西中取出東西
現在有三種方法:

# 字典mystuff['apple']# 模塊mystuff.apple()print mystuff.tangerine# 類thing = mystuff()thing.apple()print thing.tangerine

第一個類
你可能還有很多疑問,不要著急,暫時先放放這些疑問,下一個練習我們學校面向對象的知識,下面我們先了解一下類的寫法,為下一練習做準備。

class Song(object):     def __init__(self, lyrics):     self.lyrics = lyrics     def sing_me_a_song(self):     for line in self.lyrics:       print line   happy_bday = Song(["Happy birthday to you",   "I don't want to get sued",   "So I'll stop right there"])   bulls_on_parade = Song(["they relly around the family",   "With pockets full of shells"])   happy_bday.sing_me_a_song() bulls_on_parade.sing_me_a_song() 


運行結果

Happy birthday to youI don't want to get suedSo I'll stop right therethey relly around the familyWith pockets full of shells

繼承

你必須明白一個重要的概念,就是類和對象的不同。問題是,類和對象沒有真正的區別,他們在不同的時間是相同的東西,我將用禪語解釋他們:

魚和鮭魚的區別是什么呢?

這個問題是不是很暈?坐下來想想,我的意思是,魚和鮭魚是不同的,但是又是相同的,對嗎?鮭魚是魚的一種,所以沒有什么不同。但是,鮭魚是魚的一個分類,并且和其他魚的分類不同。所以鮭魚和魚既相同又不同。

我們不需要真的知道鮭魚和魚的區別,只要知道鮭魚是魚的一種,而魚還有其他很多種類就可以了。

現在讓我們更近一步,假設你有三條鮭魚,并且給他們取名為Frank,Joe,Mary,那么思考這個問題:

Mary和鮭魚有什么區別?

這也是一個奇怪的問題,但是比上個問題簡單一點。你知道Mary是一條鮭魚,她是鮭魚的一個實例。Joe和Frank也是一個鮭魚的實例。但是我們說的實例是什么意思呢?意思就是他們創建于鮭魚,然后現在是一個真實東西,鮭魚就像他們的屬性。

現在記住了:魚是一個類,鮭魚也是一個類,Mary是一個對象。好好想想,你能明白過來的。

魚是一個類,就是說魚不是一個真正存在的東西,但是我們通過它的相似的特點去實例化一些東西,比如,有鱗片,有鰓,生活在水里等,那么這個東西就是一條魚。

然后一個專家過來說:”這些魚是鮭魚。“ 這個專家給這些魚定義一個新類”鮭魚“,這個類有一些特別的屬性,長鼻子,紅色的肉,生活在海里,味道美味,好吧,它就是鮭魚。

最后,一個廚師過來對專家說:不,你看到的鮭魚在這里,我叫它Mary,我要把她做成一道美味。”現在,你就有了一個鮭魚的實例(也是魚的實例)叫做Mary,我們叫這個實例是一個對象。

現在我們得出:Mary是一種鮭魚,鮭魚是一種魚。對象是一個類,而類又是另外一個類。

寫成代碼是這樣的
這個概念有些奇怪,不過你只要在創建和使用類的時候注意一下就可以了,我來告訴你兩個區別類和對象的方法。

第一,你要學習兩個短語“is-a”和“has-a”。is-a就是對象和類之間通過類的關系想關聯,has-a是對象和類相關聯是因為他們彼此參考。

下面用這兩個關系標注下面的程序,記住,魚和鮭魚是is-a的關系,鮭魚和鰓是has-a的關系。

## Animal is-a object (yes, sort of confusing) look at the extra credit class Animal(object):   pass  ## ?? is-a class Dog(Animal):    def __init__(self, name):     ## ?? has-a     self.name = name  ## ?? is-a  class Cat(Animal):    def __init__(self, name):     ## ?? has-a     self.name = name  ## ?? is-a class Person(object):    def __init__(self, name):     ## ?? has-a     self.name = name      ## Person has-a pet of some kind     self.pet = None  ## ?? has-a class Employee(Person):    def __init__(self, name, salary):     ## ?? hmm what is this strange magic?     super(Employee, self).__init__(name)     ## ?? has-a     self.salary = salary  ## ?? is-a class Fish(object):   pass  ## ?? is-a class Salmon(Fish):   pass  ## ?? is-a class Halibut(Fish):   pass   ## rover is-a Dog rover = Dog("Rover")  ## ?? is-a satan = Cat("Satan")  ## ?? is-a mary = Person("Mary")  ## ?? is-a mary.pet = satan  ## ?? is-a frank = Employee("Frank", 120000)  ## ?? is-a frank.pet = rover  ## ?? is-a flipper = Fish()  ## ?? is-a crouse = Salmon()  ## ?? is-a harry = Halibut() 

關于 class Name(object)
我讓你使用class Name(object)但是沒有告訴你為什么。因為怕你混淆,并且不知道怎么學習。

最初python設計類的時候有很多問題,等發現的時候已經太晚了,它們必須要支持這種錯誤的類。為了修正這個問題,他們必須設計一個新類方便舊的類能繼續使用,而且新的類也能正確使用。

這就是為什么類要繼承object類,是不是有點混亂,這里的object指的是類,而不是字面上的解釋為對象。

你就記住,一個新的頂級類必須繼承object就好了。不要太多糾結于字面上的理解,我們要留著思考更加重要的事情。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美电影免费观看电视剧大全| 午夜精品国产精品大乳美女| 欧洲亚洲在线视频| 成人中文字幕+乱码+中文字幕| 国产亚洲福利一区| 日韩高清电影好看的电视剧电影| 国产精品电影一区| 91精品国产91久久久久久不卡| 国产精品三级久久久久久电影| 久久精品国产亚洲精品| 91福利视频网| 九九九久久国产免费| 国产精品一区二区久久久| 亚洲国产精品专区久久| 色无极影院亚洲| 日韩视频免费在线| 国产精品白丝av嫩草影院| 国产精品va在线播放我和闺蜜| 亚洲综合小说区| 91精品国产自产在线老师啪| 精品成人久久av| 亚洲视频在线免费观看| 日产日韩在线亚洲欧美| 欧美老女人www| 国色天香2019中文字幕在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩影视在线观看| 国产精品美女www爽爽爽视频| 国产不卡av在线| 欧美精品手机在线| 亚洲人成电影网站| 92裸体在线视频网站| 成人黄色免费网站在线观看| 911国产网站尤物在线观看| 性色av一区二区咪爱| 亚洲人成亚洲人成在线观看| 91精品国产91久久久久久| 日韩在线欧美在线| 2020欧美日韩在线视频| 色先锋资源久久综合5566| 97碰碰碰免费色视频| 亚洲精品中文字幕女同| 热久久美女精品天天吊色| 亚洲色图第三页| 久久韩国免费视频| 热99在线视频| 26uuu亚洲国产精品| 日韩精品免费视频| 日韩视频精品在线| 欧美中文在线免费| 日韩欧美亚洲国产一区| 久久伊人精品视频| 国产精品一区二区久久精品| 久久免费精品视频| 久久亚洲综合国产精品99麻豆精品福利| 日韩小视频在线| 精品国产鲁一鲁一区二区张丽| 国产精品色婷婷视频| 久久九九免费视频| 欧美俄罗斯乱妇| 国产精品人成电影在线观看| 国内精品久久久久| 一区二区三区动漫| 久久久久久久久久久网站| 日本精品视频在线| 精品一区二区三区三区| 国产精品一区二区三区免费视频| 日韩av在线免费观看| 国产精品久久久久久久久久ktv| 久久久国产在线视频| 国产欧美日韩亚洲精品| 亚洲日本欧美中文幕| 欧美性高跟鞋xxxxhd| 亚洲大尺度美女在线| 日韩禁在线播放| 欧美性xxxx极品高清hd直播| 国产91露脸中文字幕在线| 97av在线视频| 国产日韩欧美在线视频观看| 国内精品久久久| 韩国日本不卡在线| 欧美大胆a视频| 亚洲精品xxxx| 欧洲美女7788成人免费视频| 精品久久久久久中文字幕大豆网| 亚洲人永久免费| 欧美中文字幕在线播放| 日韩中文娱乐网| 色777狠狠综合秋免鲁丝| 欧美丝袜美女中出在线| 亚洲精品国产福利| 国产一区二区三区丝袜| 91中文在线视频| 欧美日韩中文在线观看| 日韩少妇与小伙激情| 中文字幕日韩视频| 亚洲va久久久噜噜噜久久天堂| 欧美黑人国产人伦爽爽爽| 亚洲欧美日韩另类| 成人在线中文字幕| 国产精品流白浆视频| 亚洲欧美日韩中文在线制服| 7777精品久久久久久| 韩剧1988在线观看免费完整版| 精品性高朝久久久久久久| 欧美最近摘花xxxx摘花| 热99久久精品| 亚洲精品一二区| 久久久久久久久久久免费精品| 国产国语videosex另类| 亚洲精品99久久久久中文字幕| 一本大道香蕉久在线播放29| 久久99久久久久久久噜噜| 欧美日韩中国免费专区在线看| 亚洲一区第一页| 亚洲电影免费观看高清完整版在线观看| 北条麻妃99精品青青久久| 欧美做受高潮电影o| 色综合久久天天综线观看| 国产精品精品视频一区二区三区| 最近2019年好看中文字幕视频| 成人免费网站在线| 日韩电视剧在线观看免费网站| 国产精品日韩久久久久| 色播久久人人爽人人爽人人片视av| 色噜噜狠狠狠综合曰曰曰88av| 45www国产精品网站| 97在线免费视频| 亚洲精品国产成人| 播播国产欧美激情| 日本午夜人人精品| 91经典在线视频| 精品国产91乱高清在线观看| 国产啪精品视频网站| 亚洲精品720p| 国产日韩在线观看av| 精品亚洲夜色av98在线观看| 国产精品日韩在线一区| 欧美不卡视频一区发布| 久久国产精品电影| 7m第一福利500精品视频| 国产一区二区在线免费| 海角国产乱辈乱精品视频| 亚洲电影免费观看高清完整版在线| 欧美精品在线网站| 久久精品亚洲一区| 91理论片午午论夜理片久久| 一区二区三区四区精品| 国产脚交av在线一区二区| 国产美女高潮久久白浆| 久久亚洲精品一区二区| 欧美色videos| 91亚洲精华国产精华| 日韩电影在线观看免费| 久操成人在线视频| 久久精品国产96久久久香蕉| 成人高清视频观看www| 国产精品第一第二| 久久影视电视剧免费网站| 亚洲精品视频在线观看视频| 原创国产精品91| 国产日韩欧美夫妻视频在线观看| 91最新在线免费观看| 欧美香蕉大胸在线视频观看|