包就是文件夾;包能夠有多級;python
模塊就是 xxx.py文件;能夠建立本身的模塊,而且導入它們,模塊的名字就和文件的名字相同;編程
Python使用import語句導入一個模塊。app
import math
print math.sqrt(16) # => 4ide
只但願導入用到的math模塊的某幾個函數函數
from math import ceil, floor
print ceil(3.7) # => 4.0
print floor(3.7) # => 3.0測試
# 從模塊中導入全部的定義
# 警告:不推薦使用
from math import *網站
使用 from...import 導入 函數,有時候會引發同名衝突。這時,能夠給函數起個「別名」來避免衝突;
ui
from math import log
from logging import log as logger # logging的log如今變成了logger
print log(10) # 調用的是math的log logger(10, 'import from logging') # 調用的是logging的log
# 也能夠經過dir方法查看模塊中有什麼屬性和方法
import math
dir(math)spa
dir()#當前模塊的定義,但不會列出內置函數和變量名,他們在標準模塊‘_builtin_’中定義
import __builtin__
print(dir(__builtin__))#若是一個模塊被修改了,可使用imp.reload從新加載模塊的新定義import imp3d
imp.reload(math)
查找模塊
導入一個 xxx模塊,解釋器首先查找 xxx.py的文件,當找到該模塊時,解釋器將它編譯成一個.pyc文件。當再次導入模塊時,解釋器能夠加載編譯好的模塊,加速Python腳本的運行;若是導入的模塊不存在,Python解釋器會報 ImportError 錯誤:解釋器查找模塊搜索路徑指定在sys模塊的sys.path變量中的全部目錄;
sys.path由環境變量PYTHONPATH初始化,若是沒有設定PYTHONPATH,就由內置的默認值初始化,能夠用標準的字符串操做修改它:
import sys
sys.path.append(r"C:\Program Files")
安裝第三方模塊
-easy_instal
-pip(推薦,已內置到 Python 2.7.9)
python -m pip install --upgrade pip 升級pip命令
第三方庫都會在Python官方的pypi.python.org網站註冊,要安裝一個第三方庫,必須先知道該庫的名稱;
進入window 命令符,鍵入 pip help
鍵入命令pip install numpy下載安裝相關包(用於科學計算的NumPy庫);注意多版本共存的問題,使用哪一個版本的pip 須要cd 到其 目錄下:
Python的新版本會引入新的功能,可是,實際上這些功能在上一個老版本中就已經存在了。要「試用」某一新的特性,就能夠經過導入__future__模塊的某些功能來實現。
當新版本的一個特性與舊版本不兼容時,該特性將會在舊版本中添加到__future__中,以便舊的代碼能在舊版本中測試新特性。
Python 2.7的整數除法運算結果還是整數:Python 3.x已經改進了整數的除法運算,「/」除將獲得浮點數,「//」除才還是整數:要在Python 2.7中引入3.x的除法規則,導入__future__的division
from __future__ import division
print 10/3
定義類是經過class
關鍵字;定義一個Person類以下:
class Person(object): pass
按照 Python 的編程習慣,類名以大寫字母開頭,緊接着是(object),表示該類是從哪一個類繼承下來的。一般,若是沒有合適的繼承類,就使用object
類,這是全部類最終都會繼承的類;
建立對象使用 類名+(),相似函數調用的形式建立:
xiaoming = Person()
xiaohong = Person()
因爲Python是動態語言,對每個對象,均可以直接給他們的屬性賦值,例如,給xiaoming這個對象加上name、gender和birth屬性:
xiaoming.name = 'Xiao Ming' xiaoming.gender = 'Male' xiaoming.birth = '1990-1-1'
給xiaohong加上的屬性不必定要和xiaoming相同:
xiaohong.name = 'Xiao Hong' xiaohong.school = 'No. 1 High School' xiaohong.grade = 2
基本構造函數__init__()方法,當建立對象時,__init__()方法被自動調用,__init__() 方法的第一個參數必須是 self(也能夠用別的名字,但建議使用習慣用法),後續參數則能夠自由指定,和定義函數沒有任何區別。相應地,建立對象時,就必需要提供除 self 之外的參數;
屬性訪問限制:在Python中,對象的變量名若是以__
開頭,就變成了一個私有變量(private),只有內部能夠訪問;
以"__xxx__"定義的屬性在Python的類中被稱爲特殊屬性,有不少預約義的特殊屬性可使用,特殊變量是能夠直接訪問的,不是private變量,一般咱們不要把普通屬性用"__xxx__"定義。
以一個下劃線開頭的實例變量名,好比_name
,這樣的實例變量外部是能夠訪問的,可是,按照約定俗成的規定,當你看到這樣的變量時,意思就是,「雖然我能夠被訪問,可是,請把我視爲私有變量,不要隨意訪問」。
類屬性:在類上綁定一個屬性,則全部實例均可以訪問類的屬性,而且,全部實例訪問的類屬性都是同一個,由於類屬性是直接綁定在類上的;因此,訪問類屬性不須要建立實例,就能夠直接訪問,類屬性也是能夠動態添加和修改的;當實例屬性和類屬性重名時,實例屬性優先級高,它將屏蔽掉對類屬性的訪問。
實例方法:就是在類中定義的函數,它的第一個參數永遠是 self,指向調用該方法的實例自己,其餘參數和一個普通函數是徹底同樣的;
方法也是一個屬性,因此,它也能夠動態地添加到實例上,只是須要用 types.MethodType() 把一個函數綁定到一個屬性上;並不常見,直接在class中定義要更直觀。
import types def fn_get_grade(self): if self.score >= 80: return 'A' if self.score >= 60: return 'B' return 'C' class Person(object): def __init__(self, name, score): self.name = name self.score = score p1 = Person('Bob', 90) p1.get_grade = types.MethodType(fn_get_grade, p1, Person) print p1.get_grade() # => A
類方法:經過標記一個 @classmethod,該方法將綁定到類上,而非類的實例。類方法的第一個參數將傳入類自己,一般將參數名命名爲 cls;類方法沒法得到任何實例變量,只能得到類的引用。
class Person(object): __count = 0 @classmethod def how_many(cls): return cls.__count @classmethod def set_Count(cls,count): cls.__count=count def __init__(self,name): self.name=name Person.set_Count(Person.how_many()+1) print Person.how_many() p1 = Person('Bob') print Person.how_many()
類的繼承和多態:函數super(CurClass, self)將返回當前類(CurClass)繼承的父類,而後調用__init__()方法,用於初始化父類;注意self參數已在super()中傳入,在__init__()中將隱式傳遞,不須要寫出(也不能寫);
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender class Teacher(Person): def __init__(self, name, gender, course): super(Teacher, self).__init__(name, gender) self.course=course t = Teacher('Alice', 'Female', 'English') print t.name print t.course
類型判斷:函數isinstance()能夠判斷一個變量是不是某個類型;isinstance(a, list)
多重繼承:Python容許從多個父類繼承,一個子類就能夠同時得到多個父類的全部功能。
class A(object): def __init__(self, a): print 'init A...' self.a = a class B(A): def __init__(self, a): super(B, self).__init__(a) print 'init B...' class C(A): def __init__(self, a): super(C, self).__init__(a) print 'init C...' class D(B, C): def __init__(self, a): super(D, self).__init__(a) print 'init D...'
多重繼承經過 super()調用__init__()方法時,A 雖然被繼承了兩次,但__init__()只調用一次;
解析類屬性的規則:順序是深度優先,從左到右;先在派生類(D)中查找某個屬性,而後搜索 B,而後(遞歸的)搜索其基類,若是尚未找到,就搜索 C,以此類推;
獲取對象信息:type() 函數獲取變量的類型,它返回一個 Type 對象:
t = Teacher('Alice', 'Female', 'English')
type(t) #=> <class '__main__.Teacher'>
dir() 函數獲取變量的全部屬性:對於實例變量,dir()返回全部實例屬性,包括`__class__`這類有特殊意義的屬性。
getattr() 和 setattr( )函數:獲取或者設置對象的屬性;
getattr(t, 'name') # 獲取name屬性
setattr(t, 'name', 'Adam') # 設置新的name屬性
getattr(t, 'age') # 獲取age屬性,可是屬性不存在,報錯
getattr(t, 'age', 20) # 獲取age屬性,若是屬性不存在,就返回默認值20
定製類: