Python - Learn Note (3)

Python之模塊

    就是文件夾;包能夠有多級;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__

Python的新版本會引入新的功能,可是,實際上這些功能在上一個老版本中就已經存在了。要「試用」某一新的特性,就能夠經過導入__future__模塊的某些功能來實現。

當新版本的一個特性與舊版本不兼容時,該特性將會在舊版本中添加到__future__中,以便舊的代碼能在舊版本中測試新特性。

Python 2.7的整數除法運算結果還是整數:Python 3.x已經改進了整數的除法運算,「/」除將獲得浮點數,「//」除才還是整數:要在Python 2.7中引入3.x的除法規則,導入__future__division

from __future__ import division
print 10/3

python之類和對象

定義類是經過class關鍵字;定義一個Person類以下:

class Person(object):
    pass

按照 Python 的編程習慣,類名以大寫字母開頭,緊接着是(object),表示該類是從哪一個類繼承下來的。一般,若是沒有合適的繼承類,就使用object類,這是全部類最終都會繼承的類;
建立對象使用 類名+(),相似函數調用的形式建立:

xiaoming = Person() 
xiaohong = Person()

因爲Python是動態語言,對每個對象,均可以直接給他們的屬性賦值,例如,給xiaoming這個對象加上name、genderbirth屬性:

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()
View Code

類的繼承和多態:函數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
View Code

 類型判斷:函數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...'
View Code

多重繼承經過 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

定製類:

python之異常

相關文章
相關標籤/搜索