Python學習筆記(五)模塊及面向對象編程

參考資料:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868200171577d6385bb5b4f4875bee9cbf0f0fa29c5000

https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868200385680e8cf932dba9433ea367de9aba2b4784000

1、模塊。

     在Python中,一個.py文件就稱之爲一個模塊(Module)。使用模塊還可以避免函數名和變量名衝突。相同名字的函數和變量完全可以分別存在不同的模塊中,因此,我們自己在編寫模塊時,不必考慮名字會與其他模塊衝突。但是也要注意,儘量不要與內置函數名字衝突。            
     爲了避免模塊名衝突,Python又引入了按目錄來組織模塊的方法,稱爲包(Package)。引入了包以後,只要頂層的包名不與別人衝突,那所有模塊都不會與別人衝突。每一個包目錄下面都會有一個__init__.py的文件,這個文件是必須存在的,否則,Python就把這個目錄當成普通目錄,而不是一個包。__init__.py可以是空文件,也可以有Python代碼,因爲__init__.py本身就是一個模塊,而它的模塊名就是所在的目錄名。             
       Python內置了很多模塊,安裝後即可使用。使用前,需要使用import關鍵字將其引用進來。             
       引用模塊時,還可以使用別名,這樣,可以在運行時根據當前環境選擇最合適的模塊。例子代碼如下:

try:
    import cStringIO as StringIO
except ImportError: # 導入失敗會捕獲到ImportError
    import StringIO

      這樣就可以優先導入cStringIO。如果有些平臺不提供cStringIO,還可以降級使用StringIO。導入cStringIO時,用import ... as ...指定了別名StringIO,因此,後續代碼引用StringIO即可正常工作。

      在一個模塊中,我們可能會定義很多函數和變量,但有的函數和變量我們希望給別人使用,有的函數和變量我們希望僅僅在模塊內部使用。       

       正常的函數和變量名是公開的(public),可以被直接引用,比如:abc,x123,PI等;       
類似__xxx__這樣的變量是特殊變量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__,我們自己的變量一般不要用這種變量名;       
     類似_xxx和__xxx這樣的函數或變量按照約定是非公開的(private),不應該被直接引用,比如_abc,__abc等;儘管Python並沒有一種方法可以完全限制訪問private函數或變量,但是,從編程習慣上不應該引用private函數或變量。       
  在Python中,安裝第三方模塊,是通過setuptools這個工具完成的。Python有兩個封裝了setuptools的包管理工具:easy_install和pip。目前官方推薦使用pip。一般來說,第三方庫都會在Python官方的pypi.python.org網站註冊,要安裝一個第三方庫,必須先知道該庫的名稱,可以在官網或者pypi上搜索,比如Python Imaging Library的名稱叫PIL,因此,安裝Python Imaging Library的命令就是:        

pip install PIL

當我們試圖加載一個模塊時,Python會在指定的路徑下搜索對應的.py文件,如果找不到,就會報錯。默認情況下,Python解釋器會搜索當前目錄、所有已安裝的內置模塊和第三方模塊,搜索路徑存放在sys模塊的path變量中。如果我們要添加自己的搜索目錄,有兩種方法:

        一是直接修改sys.path,添加要搜索的目錄:
        >>> import sys
        >>> sys.path.append('...')
        這種方法是在運行時修改,運行結束後失效。
        第二種方法是設置環境變量PYTHONPATH,該環境變量的內容會被自動添加到模塊搜索路徑中。設置方式與設置Path環境變量類似。注意只需要添加你自己的搜索路徑,Python自己本身的搜索路徑不受影響。        Python的每個新版本都會增加一些新的功能,或者對原來的功能作一些改動。有些改動是不兼容舊版本的,也就是在當前版本運行正常的代碼,到下一個版本運行就可能不正常了。Python提供了__future__模塊,把下一個新版本的特性導入到當前版本,於是我們就可以在當前版本中測試一些新版本的特性。舉例說明如下:

from __future__ import division

print 10 / 3
print 10.0 / 3
print 10 // 3

2、面向對象編程。面向對象編程——Object Oriented Programming,簡稱OOP,是一種程序設計思想。OOP把對象作爲程序的基本單元,一個對象包含了數據和操作數據的函數。它是相對於傳統的面向過程的程序設計而言。

    面向過程的程序設計把計算機程序視爲一系列的命令集合,即一組函數的順序執行。爲了簡化程序設計,面向過程把函數繼續切分爲子函數,即把大塊函數通過切割成小塊函數來降低系統的複雜度。
   而面向對象的程序設計把計算機程序視爲一組對象的集合,而每個對象都可以接收其他對象發過來的消息,並處理這些消息,計算機程序的執行就是一系列消息在各個對象之間傳遞。
   在Python中,所有數據類型都可以視爲對象,當然也可以自定義對象。自定義的對象數據類型就是面向對象中的類(Class)的概念。面向對象的設計思想是從自然界中來的,因爲在自然界中,類(Class)和實例(Instance)的概念是很自然的。Class是一種抽象概念,所以,面向對象的設計思想是抽象出Class,根據Class創建Instance。面向對象的抽象程度又比函數要高,因爲一個Class既包含數據,又包含操作數據的方法。

      Python中使用關鍵字class來定義類,語法格式:類名=class(父類名稱)。Python類通過定義一個特殊的__init__方法(構造函數),在創建實例的時候,將類的屬性強制綁定。例子代碼如下:

class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score

      __init__方法的第一個參數永遠是self,表示創建的實例本身,因此,在__init__方法內部,就可以把各種屬性綁定到self,因爲self就指向創建的實例本身。

   有了__init__方法,在創建實例的時候,就不能傳入空的參數了,必須傳入與__init__方法匹配的參數,但self不需要傳,Python解釋器自己會把實例變量傳進去,例子代碼如下:

bart = Student('Bart Simpson', 59)
print bart.name, bart.score

    和普通的函數相比,在類中定義的函數只有一點不同,就是第一個參數永遠是實例變量self,並且,調用時,不用傳遞該參數。除此之外,類的方法和普通函數沒有什麼區別,所以,仍然可以用默認參數、可變參數和關鍵字參數。

       在Python中,實例的變量名如果以__(雙下劃線)開頭,就變成了一個私有變量(private),只有內部可以訪問,外部不能訪問

     Python中可使用type()函數輸出實例的類名稱,使用isinstance()函數判斷實例是否爲指定的類,dir()函數輸出給定類名中包含的所有屬性和方法名稱列表,getattr()函數獲取實例指定屬性(方法)的值、setattr()函數設置實例指定屬性(方法)的值、hasattr()函數判斷實例是否包含指定名稱的屬性(方法)。例子代碼如下:

class Student(object):
    def __init__(self):
        self.name = None
class Teacher(object):
    def __init__(self):
        self.age = 0
a = Student()
a.name = 'mary'
b = Teacher()
b.age = 30
print 'Type of a is ', type(a)
print 'Is a instance of Student?', isinstance(a, Student)
print 'Is a instance of Teacher?', isinstance(a, Teacher)
print 'Did a include name?', hasattr(a, 'name')
print 'Did b include name?', hasattr(b, 'name')
setattr(b, 'name', 'tom')
print 'Did b include name after setattr?', hasattr(b, 'name')
print 'Name of b is ', getattr(b, 'name')
本節學習完畢,下一節從面向對象高級編程學起!
發佈了80 篇原創文章 · 獲贊 3 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章