1. 程式人生 > >python私有化,import,封裝,繼承,多型

python私有化,import,封裝,繼承,多型

 

 

封裝就是拿面向過程的全域性變數和函式搞成面向物件中類的屬性和方法。

繼承:減少程式碼重複量。減少程式碼的冗餘。

多型就是一個子類繼承了父類。但是每一個子類中都可以改寫父類的方法。比如A子類改寫了父類的C方法,B子類也改寫了父類的C方法。那麼再把改了父類C方法的子類傳到H類中,在H類中呼叫這兩個子類的C方法得到的結果就會不一樣。但是呼叫父類其他方法還是得到的結果還是一樣的。多型概括起來就是一個函式有多種形態,如上面說的父類的C方法。可以是A子類的C方法

也可以是B子類的C方法,也可以是它自己的C方法。這樣一個方法在不同的情況下就有多種形態了。

 

python裡面沒有過載,只有重寫。過載的意思是呼叫的函式名一樣,但是傳的實參不一樣,得到的結果也會不一樣。

python裡面不允許函式重名,所以沒有過載。但是可以對父類的函式進行重寫。

 

#_author:'DJS'
#date:2018-12-10
#import xxx  然後用xxx裡面的方法,xxx.sss,xxx.sss=[x,c,d] 可以在當前檔案和xxx模組裡面改變sss的值(自己寫的模組或者.py檔案)
#from xxx import sss   然後用xxx裡面的方法,sss=[x,c,d],這樣的話只能改變當前檔案sss變數的值
#改變不了xxx模組裡面sss的值 ssss是一個列表。sss.append()那麼可以往模組裡面新增值

import sys
from imp import reload
reload(sys)#表示的是重新載入模組,匯入模組的時候有時候匯入不進來就重新載入。
#可以實時載入模組裡面修改的程式碼,必須import xxx這種方式匯入的才可以用,from那種不可以。先匯入再載入
print(sys.path) #檢視匯入模組的先後路徑

class huwei():
    #huuwei作業系統
    def __init__(self,name):
        self.name = name
        self.apps = []  #安裝的應用程式的名稱列表

    def __str__(self): #魔法方法,魔法方法都是例項化物件就會自動執行的
        return "%s 安裝軟體列表為 %s" %(self.name,str(self.apps))

    def install_app(self,app):
        #判斷是否安裝了軟體
        if app.name in self.apps:
            print("已經安裝了%s無需再次安裝"% app.name) #__str__列印類的時候就會出來
        else:
            app.install()
            self.apps.append(app.name)

class App():
    def __init__(self,name,version,desc):
        self.name = name
        self.version = version
        self.desc = desc

    def __str__(self):
        return "%s 的版本是 %s-%s" %(self.name,self.version,self.desc)

    def install(self): #多型主要體現在這裡,重寫父類的install方法
        print("將 %s [%s] 的執行程式複製到軟體目錄..." %(self.name,self.version))

class Pycharm(App):
    pass

class Chrome(App):
    def install(self):
        print("正在解壓安裝程式...")
        super().install()

czxt = huwei("華為作業系統")
# print(czxt)
pycharm = Pycharm("PyCharm","1.0","python 開發的IDE環境")
chrome = Chrome("Chrome","70.0","谷歌瀏覽器")

czxt.install_app(pycharm) #呼叫czxt裡面的install_app方法再傳入引數,類中那些魔法方法會自動執行。
##傳參的時候如果是個例項化物件,則是先執行例項化物件裡面的方法,在執行被傳參的函式。
czxt.install_app(chrome)
czxt.install_app(chrome)

print(czxt)

## 引數,*args,*kwargs ,python中有*的表示python解析器會特殊對待對待

def tests(a,b,*args,**kwargs): #,*args,*kwargs
    print(a)
    print(b)
    print(args)
    print(kwargs)
tests(22,33,44,66,77)

##property屬性

class Good():

    @property
    def size(self): #這裡面只能傳遞一個引數,多的話就會報錯
        return 100

ret = Good()
ret = ret.size#呼叫屬性  #property的目的是讓程式碼的可讀性更高,這裡可以直接看做為呼叫一個屬性
#而不是一個方法的返回值
print(ret)

class Good():
    #python3預設繼承object類,所以在python3中有
[email protected]
[email protected] @property def price(self): #設定方法 print('@property') @price.setter #獲取方法 def price(self,value): print("@price.setter") @price.deleter #刪除方法 def price(self): print("@price.deleter") print(help(property)) #help能檢視一個物件接收多少個引數