久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

[Python 技術(shù)培訓(xùn)] 第二周講稿

 LCh3q6thssjf57 2016-02-04
上半場·面向?qū)ο缶幊坛醪?/span>


  上周我們簡單掃描了一下 Python 的基本語法。其實(shí)說到底那個(gè)還是 C++, 不過大家不必太擔(dān)心, 我從 Python 1.5 開始一直寫的就是這種 Python, 直到第三年才警醒 Python 其實(shí)要比 C++ 好玩得多, 但是這種風(fēng)格的 Python 已經(jīng)足以滿足我日常所有的需要了。


  不過我們不應(yīng)該滿足于此, 說句讓我自己汗言的話, 其實(shí)我走了三年彎路,。當(dāng)然問題也不全在我, 當(dāng)年 Python 1.5 的特性還不是非常豐富。斗轉(zhuǎn)星移, 現(xiàn)在已經(jīng)是 Python 2.4 了, 我們就更沒有理由去走老路了,。為此, 我們需要更為深入地掌握 Python 的語言特點(diǎn) (當(dāng)然, 這里很搞笑, Python 所謂特性基本上都可以在其他語言中找到出處, 感覺有點(diǎn)像深圳的世界大觀),。Python 的各種語言特點(diǎn)互相融合在一起, 和 C++ 比起來一點(diǎn)都不生硬, 一點(diǎn)也不令人討厭,。嗯, 就如同 C 一樣的簡潔、美麗,。所以在 Python 里面有一個(gè)詞, 叫做 Pythonic, 它的意思是假如你遇到釘子了, 不是因?yàn)槟悴粔蛟O(shè)計(jì)或者不夠模式, 是因?yàn)槟銢]有用 Python 的方法去做事情,。Python 下面一切都是那么簡單, 那么好玩 -- 這個(gè)就是 Python 的方法, Pythonic。


  這是以熟悉 Python 的高級(jí)特性為基礎(chǔ)的,。說到這里, 想起我們部門新來兩位同事, 在使用 Python 做項(xiàng)目之前, 先沉下心來做了兩周的 Python Challenge, 把 Python 模了個(gè)透, 結(jié)果兩周后程序?qū)懗鰜硐喈?dāng)漂亮, 甚至讓我這種老牌 Python 程序員跌破眼鏡, 與我周圍的同事立馬有了境界上的區(qū)分,。


  所以上周我迫不及待地說這周要把 Python 的高級(jí)特性介紹給大家, 這個(gè)是我本來的打算。但是無數(shù)次有人暈倒在我的技術(shù)推廣講座上的慘痛教訓(xùn)讓我放慢了進(jìn)度,。


  好了, 今天是面向?qū)ο缶幊獭?br>


  我不太喜歡所謂 "面向?qū)ο?的編程方式, 相反對(duì) "基于對(duì)象" 的方法情有獨(dú)鐘,。這里, 面向?qū)ο笫鞘裁礀|西呢? 我想大家都接觸過, 但實(shí)際上大家也許用的都是 "基于對(duì)象" 的方法。面向?qū)ο? 是一個(gè)很沒意思,、很意識(shí)形態(tài),、很一根筋的東西。為什么呢, 就用用對(duì)象不行嗎? 不行, 你一定要用類繼承, 你一定要多態(tài), 你一定要虛一個(gè)函數(shù), 你一定要怎么怎么樣才行, 這才能叫面向?qū)ο?。哼? 寫程序不是擺地?cái)? 不是賣東西, 這樣你累不累啊? 務(wù)實(shí)一點(diǎn)吧, 該用什么用什么去, 我寧愿就用一點(diǎn)點(diǎn), 我寧愿僅僅基于對(duì)象來做事情,。所以以后有人說你不 "懂面向?qū)ο?, 大可不理, 讓別人去懂吧。


  今天回過頭來還是要講講面向?qū)ο蟮臇|西,。話說回來, "面向" 這個(gè)東西雖然沒什么意思, "對(duì)象" 還是非常有用的,。還是那句話, 等我們玩熟了 "面向?qū)ο? 的東西, 就會(huì)發(fā)現(xiàn)它可笑的一面, 或者簡直就是一無是處, 這個(gè)時(shí)候, 你就可以用面向?qū)ο髞碚嬲_始寫程序了。


  上次講到類,。類是萬惡之首, 將來講到 "配置編程" 和 C 與 C++ 的 "真正分野" 的時(shí)候我會(huì)重新回過頭來講這個(gè)東西?,F(xiàn)在回來:

    class Foo:
      def __init__(self, a, b):
        self.a = a
        self.b = b

      def show_a(self):
        print self.a

      def show_b(self):
        print self.b

    foo_obj = Foo("I'm A", "I'm B")
    foo_obj.show_a()

    foo_obj.b = "Hello world!"
    foo_obj.show_b()


  這個(gè)例子很簡單, __init__ 函數(shù)是每次生成類的時(shí)候都會(huì)執(zhí)行的, self 指向類對(duì)象自身。 記住, 類函數(shù)(或者叫做方法) 它的第一個(gè)參數(shù) "self" 不要忘記寫了, 其他的我就不深入講了,。請(qǐng)大家注意命名規(guī)范類的首字母大寫, 沒有特別原因不要在前面加 "T" 或者 "C" 什么的,。函數(shù)和變量盡量全小寫, 單詞間下劃線。


  下面是一個(gè)命名規(guī)范, 就是類里面 "單下劃線" 開始的成員變量叫做保護(hù)變量, 意思是只有類對(duì)象和自類對(duì)象自己能訪問到這些變量; 而 "雙下劃線" 開始的是私有成員, 意思是只有類對(duì)象自己能訪問, 連子類對(duì)象也不能訪問到這個(gè)數(shù)據(jù),。這是個(gè)悲劇性的設(shè)計(jì)思想, 我不打算詳細(xì)講什么是 "保護(hù)成員" 什么是 "私有成員" 請(qǐng)大家自己去查閱面向?qū)ο蟮南嚓P(guān)資料,。下面是使用私有成員的一個(gè)例子。

    class Fool:
      def __init__(self):
        self.__a = None # None 就是什么都沒有

      def set_a(self, a):
        self.__a = a

      def get_a(self):
        print self.__a

    fool_obj = Fool()
    print foo.__a # 哼哼, 等著報(bào)錯(cuò)吧,
    #                 # 只有 foo "自己" 才可以 "看見" __a

    fool_obj.set_a("I'm A")
    print fool_obj.get_a()


  把對(duì)象里面的成員保護(hù)起來, 曾經(jīng)流行過一段時(shí)間, 特別是 Java 里面, 程序員似乎養(yǎng)成了習(xí)慣, 要改點(diǎn)東西一定要 get/set 一番, 也不覺得累,。后來人們才發(fā)現(xiàn)好端端的 "等號(hào)" 不用非要搞一大堆勞什子 get 和 set 函數(shù), 還在那里自稱 "隱藏實(shí)現(xiàn)", 完全是自我虐待,。聰明起來之后, 才找到真正 "隱藏實(shí)現(xiàn)" 的方法, 就是重定義等號(hào)運(yùn)算符, 把許多本來就是應(yīng)該用 get 和 set 的地方 (比如 get_time, 當(dāng)前時(shí)間每次都要生成, 似乎只能用方法得到) 用直接操作成員變量的方法來做 (用等號(hào)代替函數(shù), 這個(gè)以后會(huì)講)。


  更深一層講, 真正漂亮,、收放自如的程序敢于暴露自己的實(shí)現(xiàn)細(xì)節(jié), 用最輕量級(jí)的方法來做事情,。重量級(jí)的程序常常會(huì)被自己絆倒, 一大堆的無謂封裝和重復(fù)封裝讓程序變得很難編寫和維護(hù), 輕量級(jí)的方法用最簡單而不損失穩(wěn)定和安全性的方法來做事情, 把十倍的時(shí)間用于測試和完善; 而重量級(jí)的方法花最長的時(shí)間來營造一個(gè)虛假繁榮的世界, 花最多的時(shí)間在自我安慰上。即, 我一直在努力花更多的時(shí)間和用更復(fù)雜的方法來做事情, 我很強(qiáng), 沒有人能比我更能延長項(xiàng)目周期, 沒有人能寫出比我更拐彎抹角的程序,。


  輕量級(jí)的方法通常會(huì)很巧妙, 但不會(huì)很復(fù)雜,。有時(shí)候你寫程序也許會(huì)覺得越寫越麻煩, 那肯定是方法用錯(cuò)了; 有時(shí)候你學(xué)習(xí)編程會(huì)覺得很難, 那也肯定是方法錯(cuò)了。如果不改變自己, 習(xí)慣于用麻煩的方法寫程序,、痛苦地學(xué)習(xí), 那么我很高興地告訴你, 你掛掉了,。


  開個(gè)玩笑, 區(qū)分早期的 Python 程序和現(xiàn)代的 Python 程序的方法就是數(shù)下劃線的數(shù)量,。 用很多下劃線的程序是早期思想的產(chǎn)物, 現(xiàn)代的程序接口越來越聰明, 下劃線也就越來越少了。


  下面是繼承,。

    class Bar(Foo):
      def __init__(self, a, b, c, d):
        Foo.__init__(self, a, b)
        self.c = c
        self.d = d

      def show_c(self):
        print self.c

      def show_d(self):
        print self.d

    foo_obj.show_a()
    foo_obj.show_b()
    foo_obj.show_c()
    foo_obj.show_d()


  多重繼承,。

    class Bar(Foo1, Foo2, Foo3, ...): ...

  所謂繼承就是讓新的類, 子類得到父類 (就是那個(gè) Foo) 的成員和功能。但是最好不要忘記子類也需要一個(gè) __init__ 函數(shù), 把 a,、b,、c、d 這些成員都創(chuàng)建出來, 或者直接調(diào)用父類的 __init__ 函數(shù)來完成這件事情, 并且我們通常是這樣做的,。這里我不準(zhǔn)備做詳細(xì)的講解, 請(qǐng)大家閱讀相關(guān)文檔,。

  今天對(duì)面向?qū)ο蟮慕榻B就到這里。以后我們講到高級(jí)特性的時(shí)候還會(huì)回來,。

  現(xiàn)在我們 Have a break, 大家可以整理一下上面的內(nèi)容,。下面是提問時(shí)間。



下半場·圖形界面編程


  好, 繼續(xù)我們的話題,。在上周魏中華提醒我多講寫看得見摸得著的東西, 讓大家馬上能夠看見 Python 能夠干什么,。這確實(shí)是防止審美疲勞的好辦法。


  馬上, 圖形應(yīng)用程序界面編程,。眼球經(jīng)濟(jì)嘛, 盡管對(duì)我而言圖形界面程序?qū)ξ叶允亲顩]勁的, 但是對(duì)大部分 Windows 用戶而言是最有吸引力的,。所以先拿出來試刀了。


  大家有用過我寫的兩套圖形界面的應(yīng)用程序, 其中那個(gè)服務(wù)器管理程序似乎很小巧, 用的是一套叫做 Tkinter 的界面工具; 另外一個(gè)是帶數(shù)據(jù)庫的編輯器, 看起來比較大, 用的是 PyQt,。Python 不是一根筋, 界面工具庫數(shù)不勝數(shù)其中我最喜歡的是 wxPython, 出名的還有 PyGtk、PythonWin 等,。PythonWin 其實(shí)就是 C++ 下面的 MFC, 其他都是跨平臺(tái)的程序庫,。除了 Tkinter 其他圖形庫基本上都有類似于 Delphi、VB 那樣的所見即所得拖來拽去的界面設(shè)計(jì)工具,。不是 Tkinter 不想有這樣的開發(fā)工具, 而是用起來實(shí)在是太方便了,。下面創(chuàng)建一個(gè)窗體:

    from Tkinter import *
    wnd = Tk()


  下面加一個(gè)按鈕:

    btn = Button(master=wnd, text="Exit", command=wnd.quit)
    btn.pack()


  作為慣例, 我們通常會(huì)把 btn 加到 wnd 下面, 而使用這種寫法來創(chuàng)建:

    wnd.btn = Button(master=wnd, text="Exit", command=wnd.quit)
    wnd.btn.pack()


  最后, 讓這個(gè)窗口跑起來:

    wnd.mainloop()

  mainloop() 是一定要的, 但是請(qǐng)?jiān)谡{(diào)用 mainloop() 之前把所有該做的事情都做完, 因?yàn)橹蟮拇a在窗體退出之前都不會(huì)被執(zhí)行。

  Tkinter 是一種相當(dāng)簡單的圖形界面程序庫,。它基于 Tk/Tcl 這套工具, Tcl 被譽(yù)為最容易的圖形應(yīng)用程序開發(fā)語言, 而 Tkinter 在 Tcl 的基礎(chǔ)上利用 Python 的語言優(yōu)勢(shì)在易用性上更進(jìn)一步,。當(dāng)然有得有失, 有一種流行的說法是 Tkinter 因?yàn)檫^于簡單而不適合于開發(fā)大型應(yīng)用。然而事實(shí)上這并不是真的, 因?yàn)槭韬? 這次沒有把我的幾位同事的所有作品帶過來, 他們使用 Tkinter 編寫了極為漂亮,、同時(shí)效果相當(dāng)夸張的游戲, 包括對(duì)對(duì)碰還有紙牌游戲,。但是大家可以看到 Python 自帶的 IDLE 這套編輯器, 完全是用 Tkinter 寫的 (當(dāng)然還有大家在用的我寫的那套服務(wù)器工具)。

  下面是科學(xué)家吳國瑞隨便用 Tkinter 寫的拱豬,。這里簡單看看效果, 源碼就不放出來了, 因?yàn)閾?jù)國瑞兄自己說這個(gè)代碼是他剛開始用 Python 的時(shí)候匆匆寫就, 所以相當(dāng)出不了手, 呵呵,。

[Python 技術(shù)培訓(xùn)] 第二周講稿 - 沈崴 - 蜻蜓點(diǎn)水 舉重若輕


  我已經(jīng)把 Tkinter 的文擋給大家了, 學(xué)習(xí) Tkinter 最好的方法是把這份文擋中的代碼照抄一遍, 讓它跑起來。然后按著自己的興趣把這些例子改得更搞笑些, 并且也跑起來,。在使用的過程中, 你會(huì)發(fā)現(xiàn)其實(shí) Tkinter 能做所有的事情, 它已經(jīng)自帶了編輯框,、繪圖工具 (Canvas) 等許多組件, 剩下的基本上就是搭積木的工作了,。

  那么 Tkinter 真正的弱點(diǎn)在哪里呢, 我可以很負(fù)責(zé)任地告訴大家, 在界面效果上。毋庸置疑, Tkinter 的界面繪制相當(dāng)難看,。以至于我以前對(duì) Tkinter 相當(dāng)反感, 我和大多數(shù) Python 程序員一樣, 認(rèn)為將 Tkinter 作為 Python 的基本圖形界面庫是個(gè)陰謀, 真正時(shí)至名歸的是 wxPython,。然而很多年后, 我發(fā)現(xiàn) Tkinter 是最適合 Python 風(fēng)格的圖形界面工具, 我開始在許多場合拋棄 wxPython 和 pyQt, 重新開始使用 Tkinter, 主要是在輕量極的場合。這是我努力使自己變得不那么愚蠢的一個(gè)證明,。

  離開 Tkinter 我們就來到了 wxPython 和 pyQt 的世界,。wx 是一套已經(jīng)發(fā)展多年并最終會(huì)一統(tǒng)江湖的圖形界面庫。在 C++ 等編譯語言的世界 (Java 除外), MFC 曾經(jīng)一統(tǒng)微軟自己的天下, Unix 下面免費(fèi)的 GTK 和半開放 QT 是后來最受歡迎的界面庫 (當(dāng)然 Unix 下面界面庫多如牛毛, 還有 More or Less Tif,、Tk 等等),。我們用過 Borland 的東西, Borland 最后的 C++ Builder X 版本拋棄了強(qiáng)大的 TCL 而最終轉(zhuǎn)向了 wx, 這是其一統(tǒng)江湖的前兆。QT 是老牌的強(qiáng)力工具庫, 它在許多地方都要?jiǎng)龠^ wx, 但是也有硬傷, 比如 MOC 預(yù)編譯讓許多 C++ 原教旨主義者嚇了一跳; 以前其半開放的性質(zhì)也讓黑客社團(tuán)很惱火, 這也是以前我更多傾向于 wx 的原因, 但是現(xiàn)在 QT 已經(jīng)完全開放了,。

  比起來 pyQt 要比 wxPython 更容易, 但是比起 Tkinter 它們的易用性是個(gè)笑話,。所以用他們我通常會(huì)借助類似與 Delphi 那樣的工具。

  下面是 pyQt 可以使用的一套界面設(shè)計(jì)工具, 叫做 QtDesigner, 我們來看看,。

[Python 技術(shù)培訓(xùn)] 第二周講稿 - 沈崴 - 蜻蜓點(diǎn)水 舉重若輕

[Python 技術(shù)培訓(xùn)] 第二周講稿 - 沈崴 - 蜻蜓點(diǎn)水 舉重若輕


  學(xué)習(xí) wxPython, 必須下載它的 Demo, 里面有你需要的一切范例代碼, 甚至不需要去看它的文擋,。當(dāng)然很搞笑, wxPython 與 C++ wxWidget 共享一個(gè)文擋, 其實(shí)是 C++ 的文擋。如果你已經(jīng)視一切工具為一體的話自然會(huì)讀得很開心, 否則會(huì)有點(diǎn)吃力或者有點(diǎn)怪怪的感覺, 另一方面這些都是英文文擋,。同樣這種情況很不幸地又發(fā)生在 pyQt 上,。

  下面我們來看看最新版的 wxPython Demo。

[Python 技術(shù)培訓(xùn)] 第二周講稿 - 沈崴 - 蜻蜓點(diǎn)水 舉重若輕

[Python 技術(shù)培訓(xùn)] 第二周講稿 - 沈崴 - 蜻蜓點(diǎn)水 舉重若輕

[Python 技術(shù)培訓(xùn)] 第二周講稿 - 沈崴 - 蜻蜓點(diǎn)水 舉重若輕



  等下我會(huì)把 Windows 版本的 wxPython 下載地址給大家, 里面附帶有含金量極高的 Demo,。wxPython 中最強(qiáng)大的編輯器是 Boa constructor, 但是他沒有發(fā)布版, 只有開發(fā)和測試版,。他們說他們或許在幾年之后會(huì)完成這個(gè)編輯器發(fā)布出來。我已經(jīng)等了好多年, 這個(gè)謊言令我非常憤怒,。所以我一直用的是測試版,。這個(gè)試玩版確實(shí)有些瑕疵, 但已經(jīng)遠(yuǎn)遠(yuǎn)超過其他工具。

[Python 技術(shù)培訓(xùn)] 第二周講稿 - 沈崴 - 蜻蜓點(diǎn)水 舉重若輕

[Python 技術(shù)培訓(xùn)] 第二周講稿 - 沈崴 - 蜻蜓點(diǎn)水 舉重若輕

[Python 技術(shù)培訓(xùn)] 第二周講稿 - 沈崴 - 蜻蜓點(diǎn)水 舉重若輕

  pyQt 很遺憾, 目前不存在可用的 Windows 版本,。我成功地把 Unix 版本的 Qt 和 pyQt 移植到 Windows 下, 但是因?yàn)?X11 的原因許多地方不盡人意,。同時(shí)我費(fèi)盡苦心地拿到 Qt 的 Windows 版本, 做了一個(gè) pyQt 的 Windows 版本, 一切都好, 但是因?yàn)?Qt 在 Windows 下的版權(quán)問題也是不能用的。但至少現(xiàn)在我們這里有 pyQt 的多個(gè)版本可以供大家學(xué)習(xí),。盡管國內(nèi)許多人許多人在爭論是 wxPython 好還是 pyQt 好, 但是真的把 pyQt 編譯出來的人也就十人左右, 能夠得到全系列來進(jìn)行評(píng)估的人則更少, 這個(gè)簡直就是笑話,。

  好了, 下面請(qǐng)大家整理一下 Tkinter 的內(nèi)容。下面是提問時(shí)間,。


相關(guān)資料

wxPython [下載]
Boa constructor [下載]

C++ Qt
PyQt

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多