Python學習之路:一些BIF+魔法方法+模塊

一、類和對象中的一些BIF
①issubclass(class, classinfo) 第一個class是第二個classinfo的子類則返回True,一個類被認爲是自身的子類,後面的classinfo可以是一個元組,只要裏面有一個是class的父類則返回True
②isinstance(object,classinfo) 前面的object是一個實例對象,如果一個實例對象屬於後面一個classinfo或一個classinfo元組的話返回True
③hasattr(object, ‘name’) 測定一個實例對象object裏面是否有指定的屬性name,注意nameu要用引號,如果有則返回True
④getattr(object,’name’,default) 返回對象object對應的屬性name值,如果屬性不存在,若已設置default的值則返回其值,否則會拋出異常
⑤setattr(object,’name’,value) 設置對象object指定屬性name的值value,若歸屬性不存在,則會創建一個屬性並給它賦值爲value
⑥delattr(object,’name’) 刪除對象中指定的屬性,如果屬性不存在則拋出異常
⑦property(fget=None,fset=None,fdel=None,doc=None) 通過屬性設置屬性,前三個參數傳入已設置好的屬性 (獲取,設置,刪除 )屬性

class A:
    def __init__(self,x=666):
        self.x=x
    def getX(self):
        return self.x
    def setX(self,value):
        self.x=value
    def delX(self):
        del self.x
    y=property(getX,setX,delX)
b=A()
print(b.getX())
print(b.y)   #直接獲取屬性值
b.x=888      #直接設置屬性值,未調用setX函數
print(b.y)
del b.y  #y屬性已刪除
666
666
888

魔法方法
一、構造與析構
構造函數 :__init_(self,變量名)
_new__(cls,變量名) 爲對象實例化後調用的第一個方法,cls(類)後面若有參數會全部傳給init方法,需要返回一個實例對象,當一個類繼承了一個不可變類型且需要修改的時候,修改new方法,

class A(str):
    def __new__(cls,s):
        s=s.upper()
        return str.__new__(cls,s)
a=A("I love you")
print(a)

析構函數:_del_(self) 當創建一個實例對象,所有該實例對象的引用包括該實例對象都被del(即刪除)後,自動調用del方法

二、描述符
描述符就是將某種特殊類型的類的實例指派給另一個類的屬性
_get_(self,instance,owner) 訪問的時候被調用—用於訪問屬性,它返回屬性的值
_set_(self,instance,value) 賦值的時候被調用– -將屬性分配在操作中調用,不返回任何內容
_delete_(self,instance) 刪除屬性的的時候被調用–控制刪除操作,不返回任何內容

三、容器類型的定義
①如果定製不可變容器,只需定義_len__()和_getitem()方法
②如果定製不可變容器,除定義上述兩種方法外,還需定義__setitem_()和__delitem_()方法
_len_(self)定義當被len()調用時的行爲(返回容器中元素的個數)
_getitem_(self,key)定義·獲取容器中指定元素的行爲,相當self[key]
_setitem_(self,key,value)定義設置容器中指定元素的行爲,相當於self[key]=value
_delitem_(self,key) 定義刪除容器中指定元素的行爲,相當於del self[key]

實例:定義一個不可變列表,要求記錄列表中每個元素的被訪問的次數

class List1:
    def __init__(self,*args):   #args表示不知道用戶輸入幾個
        self.list1=[x for x in args]  #map()表示用戶輸入的值組成一個列表
        self.count={}.fromkeys(range(len(self.list1)),0)      #fromkeys()初始化一個字典,例子中,前者爲列表的下標也爲字典的key值,後者爲訪問次數,初始化爲0

    def __len__(self):
        return len(self.list1)

    def __getitem__(self,n):
        self.count[n]+=1       #每訪問一次鍵值次數加1
        return self.list1[n]
>>> L=List1(1,2,3,4,5,6)
>>> L[1]
2
>>> L[3]
4
>>> L[1]
2
>>> L.count
{0: 0, 1: 2, 2: 0, 3: 1, 4: 0, 5: 0}

四、迭代器
①iter(): -__iter_(self)
②next(): -_next_(self)

iter(),next()用法:

>>> string="ILoveYou"
>>> it=iter(string)
>>> 
>>> next(it)
'I'
>>> next(it)
'L'
>>> next(it)
'o'
>>> next(it)
'v'
>>> next(it)
'e'
>>> next(it)
'Y'
>>> next(it)
'o'
>>> next(it)
'u'
>>> next(it)    #超出範圍拋出異常
Traceback (most recent call last):
  File "<pyshell#100>", line 1, in <module>
    next(it)
StopIteration

用迭代器實現斐波那契數列:

class Fibs:
    def __init__(self,n=10):
        self.a=0
        self.b=1
        self.n=n

    def __iter__(self):
        return self

    def __next__(self):
        self.a,self.b=self.b,self.a+self.b
        if self.b>self.n:       #如果斐波那契數超過某個值拋出異常
            raise StopIteration
        else:
            return self.b
>>> fibs=Fibs()
>>> for each in fibs:
    print(each)

五、生成器
一個函數內出現 yield 語句這個函數就被定義爲生成器,yield 語句相當於普通函數的return 但它會返回yield 後對應的返回值,且函數執行暫停在當前位置,下次調用next語句繼續執行。(生成器是一個特殊的迭代器,用next()函數調用,for循環會自動調用next函數,探測StopIteration結束)

def fibs():
    a=0
    b=1
    for x in range(10):
        a,b=b,a+b
        yield b
>>> t=fibs()
>>> for each in t:
    print(each)


1
2
3
5
8
13
21
34
55
89

或者

>>> t=fibs()
>>> next(t)
1
>>> next(t)
2
>>> next(t)
3
>>> next(t)
5
>>> next(t)
8
>>> next(t)
13
next(t)

>>> next(t)
21 
>>> next(t)
34
>>> next(t)
55
>>> next(t)
89
>>> 
>>> next(t)
Traceback (most recent call last):
  File "<pyshell#120>", line 1, in <module>
    next(t)
StopIteration

列表推導式:

>>> a=[x for x in range(100) if not(x%2) and not(x%3)]
>>> a
[0, 6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72, 78, 84, 90, 96]

字典推導式:

>>> b={x: x+1 for x in range(10) if x%2}
>>> b
{1: 2, 3: 4, 5: 6, 7: 8, 9: 10}

集合推導式:

>>> c={x for x in [1,2,3,4,5,5,4,3,2,1]}
>>> c
{1, 2, 3, 4, 5}

生成器推導式:

>>> G=(x for x in range(0,10) if not(x%2))
>>> G
<generator object <genexpr> at 0x0000000002B58570>
>>> next(G)
0
>>> next(G)
2
>>> next(G)
4
>>> next(G)
6
>>> next(G)
8
>>> next(G)
Traceback (most recent call last):
  File "<pyshell#134>", line 1, in <module>
    next(G)
StopIteration

生成器作爲函數的參數,函數可直接作用於生成器中全部元素

>>> sum(x for x in range(0,10) if not(x%2))
20

六、模塊
①創建模塊:將已寫好的模塊保存在安裝python的目錄下
②導入模塊:法一: import 模塊名
法二: from 模塊名 import 函數名
法三: import 模塊名 as 新名(最好使用)

def Hi():
    print ("I Love You")
>>> import hello as H
>>> H.Hi()
I Love You

七、_name_==’_main_‘、搜索路徑和包
_name__==’__main_’ :在已寫好的模塊中需要在模塊中寫上測試語句,在測試語句前加上 if _name_==’_main_’ 則在導入模塊後不會執行模塊內的測試語句

#模塊
def calc(n):
    return n**2

def test():
    print(%calc(2))

if __name__=='__main__': #必加條件
    test()               #測試語句
#含if條件
>>> import hello
>>> hello.calc(4)
16
不含if條件
>>> import hello
4         #會先輸出測試例子
>>> hello.calc(4)
16
>>> 

②搜索路徑
路徑是一個列表

>>> import sys
>>> sys.path
['', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\Lib\\idlelib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\python36.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python36\\lib\\site-packages']

導入模塊時Python會從以上列表中的路徑搜索模塊所在位置,若找到模塊則導入,若未找到則導入失敗。site-packages文件夾設置用來存放模塊
可以自定義添加搜索路徑 語句爲:sys.path.append(‘路徑’)
對於要實現不同的方法,把模塊分門別類的存放在不同的文件夾下,把路徑添加進去

③包(package):把方法放在同一個文件夾內,便於調用
創建一個包:(1)創建一個文件夾,用於存放相關的模塊,文件夾的名字即是包的名字;
(2)在文件夾必須中創建一個_init_.py的模塊文件,內容可以爲空,(來告訴Python把這個文件夾當做一個包)
(3)將相關的模塊放入文件夾中
包的導入:import 包名 . 模塊名(其他導入方法跟模塊導入相同)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章