1. 程式人生 > >python 多態這一部分的知識點相關應用

python 多態這一部分的知識點相關應用

time() 多個 就是 實例 技術 orm 不同 size 情況

類型這塊

type 一個對象的時候,這個對象的類型,總是這個對象所屬的類

type任何一個類,它的類型都是type,type是所有數據類型和類的鼻祖

type的類型是它本身 type = type(type)

函數的類型就是函數

python是一種動態語言,一個鴨子類型舉例:動態python變量,在賦值的時候,賦值號(=)右邊的數據類(list,set,float等)對象是什麽類型,他就是什麽類型

a. 常規創造的類 總是有幾個特性:

  能夠實例化

  能有屬性

  能有方法

b.元類能夠幫助你創造不同尋常的類(下面就來了)

  不能實例化

  只能有一個實例

類 =type(該類對象)

type = type(類)

所有的類型:說的都是這個對象是屬於哪一類的

所有的用class常規語法創造出來的類都是type類型

技術分享圖片

技術分享圖片

元類的應用(歸一化設計)

歸一化設計

  a.方便用戶記憶

  b.方便用戶使用

python 的歸一化設計用的是一下的東西:

from abc import ABCMeta,abstractmethod
class Father(metaclass= ABCMeta):     #抽象類,如果你用了這種,
    def __init__(self,name,price):    #在@abstractmethod方法下面函數,在此類的每一個
        self.name 
= name #子函數必須實現該函數,但是在此類此函數可以寫一些 self.price = price #簡單代碼,抽象類也不能實例化 @abstractmethod def pay(self): pass class Wechatpay(Father): def pay(self): print(f{self.name}付了{self.price}) class Alipay(Father): def pay(self): print(f
{self.name}付了{self.price}) def pay(person): #歸一化設計 就是將zy.pay() = pay(zy) return person.pay() #方便用戶記憶 #方便用戶使用 zy = Wechatpay(zy,1000) hfl = Alipay(hfl,2000) pay(zy) pay(hfl)

多變化的抽象類繼承


from abc import ABCMeta,abstractmethod
class Normalanimals(metaclass=ABCMeta):
@abstractmethod
def eat(self):
pass
@abstractmethod
def drink(self):
pass

class
Flyanimals(metaclass=ABCMeta): @abstractmethod def fly(self): pass class Swimanimals(metaclass=ABCMeta): @abstractmethod def swim(self): pass class Tiger(Normalanimals,Swimanimals): def eat(self):pass def drink(self):pass def swim(self):pass class swam(Normalanimals,Swimanimals,Flyanimals): def eat(self):pass def drink(self):pass def swim(self):pass def fly(self):pass

鴨子類型:
python當中寫程序的一種特殊的情況
其他語言中 正常的我們說一個數據類型具有某個特點,通常是通過繼承來實現
繼承叠代器類,來證明自己本身是個叠代器
繼承可哈希的類,來證明自己本身是可哈希的
但是所有的這些都不是通過繼承來完成的
我們只是通過一種潛規則的約定,如果具有__iter__,__next__就是叠代器
如果具有__hash__方法就是可哈希的
如果具有__len__就是可以計算長度的
這樣的數據類型之間的關系並不僅僅是通過繼承來約束的
而是通過約定俗成的關系來確認的
list.index()
str.index()
鴨子類型是一種約定俗稱的關系,只在python裏有
多態:
在傳遞參數的時候,如果要傳遞的參數有可能是多個類的對象
我們又必須在於嚴重清楚的描述出到底是哪一個類型的對象
我們就可以使用繼承的形式,有一個父類作為這些所有可能被傳遞進來的對象的基類
基礎類型就可以寫成這個父類了
於是所有子類的對象都是屬於這個父類的
在python當中,因為要傳遞的對象的類型在定義階段不需要明確,所以我們在python中處處是多態
數據類型不需要通過繼承來維護統一

命名元組

創建一個不可以更改屬性,沒有自帶方法的類

調用的時候用 from collections import nametuple

對比:通過這個對比,我們知道這個類只能做調用單個參數值,連呈現內容都做不到,看來跟常量性質一樣了

from collections import namedtuple

Course = namedtuple(Course,[name,ad,hp])
python = Course(python,100,120)
print(python.name)          #只能這樣做
# print(python.__dict__)   不可行 ,連特麽的呈現內容都呈現不出來,看來跟常量的性質一樣

class A:
    def __init__(self,name,ad,hp):
        self.name = name
        self.ad = ad
        self.hp = hp
c = A(zy,12,34)
print(c.__dict__)

還有一種命名元組你想到了麽?

嘿嘿,那就是time時間模塊裏的 struct_time

它是通過 time.localtime 獲取,它的也是一個struct_time類,但是它的屬性更nametuple一樣不可更改,也不可以添加

也沒有自己的方法

>>> time.localtime()
time.struct_time(tm_year=2014, tm_mon=7, tm_mday=8, tm_hour=22, tm_min=9, tm_sec=1, tm_wday=1, tm_yday=189, tm_isdst=0)
>>> time.localtime()[1]
7
>>> time.localtime().tm_mon
7

pickle的意義

    import pickle    
    class A(object):
        def __init__(self,name,hp,ad)
            self.name = name
            self.hp = hp
            self.ad = ad
    person = A(zy,100,10)
    with open(t1,wb) as f1:
        pickle.dump(person,f1)
    with open(t1,rb)as f2:
        c = pickle.load(f2)
    print(c.__dict__)

總結:
多態的實現在其他語言中用繼承來實現,比如Java用接口實現多繼承
在python當中是通過鴨子類型來實現,弱類型語言的意思就是不同類型的變量不允許相加
python還是一種動態語言,一個鴨子類型舉例 動態python變量,在賦值的時候,賦值號(=)右邊的數據類(list,set,int,float等)對象是什麽類型 它就是什麽類型

python 多態這一部分的知識點相關應用