您好,登錄后才能下訂單哦!
小編給大家分享一下Python面向對象的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
我們已經知道在Python中“一切皆對象”,每個對象都有特定的類型,現在讓我們來嘗試創建自己的類型——這需要使用class關鍵字來定義新的“類”(Class),類是用來生成對象的“模板”,對象則是其所屬類的“實例”——以下是在交互模式中自定義Thing類,并調用其默認構造器生成一個Thing類的實例對象(注意:自定義類的命名規范要求單詞首字母大寫):
In [1]: class Thing: ...: """最簡單的自定義類""" ...: In [2]: type(Thing) Out[2]: type In [3]: t = Thing() In [4]: type(t) Out[4]: __main__.Thing
可以看到,Thing對象屬于type類型,是type類的一個實例;t對象屬于Thing類型,是Thing類的一個實例——當你在程序中定義自己的類來生成實例對象,就算是“面向對象編程”(Object-Oriented Programming,簡稱OOP)。面向對象的編程方式使用類來模擬和組織現實世界的事物,可以令程序結構更靈活、條理更清晰。
上面定義的Thing類所生成的實例對象并不能做什么事情,讓我們再來創建一個包含了具體子語句的“船”類并生成兩個“船”對象:
In [5]: class Ship: ...: """船類""" ...: def __init__(self, name=None): ...: """初始化船實例""" ...: self.name = name # 船名 ...: self.crew = 0 # 船員人數 ...: def join(self, number): ...: """船員加入""" ...: self.crew += number ...: return self.crew ...: In [6]: s1 = Ship("鄭和") In [7]: s1.crew = 200 In [8]: s2 = Ship("戚繼光") In [9]: s2.join(100) Out[9]: 100 In [10]: s2.crew Out[10]: 100
Ship類定義了一個特殊的“初始化”方法__init__,這樣就能在調用構造器生成實例時加入新的實例“屬性”(Property),所謂實例屬性就是實例對象的“成員變量”,例如Ship類的實例增加了name和crew屬性——從現實概念來理解,任何船都有船名和船員人數這兩個數據,但每艘船又有各自的具體數據值。實例屬性和實例方法是最常見的兩種類成員,Python規定特殊類成員名以兩個下劃線開始和結束,其他類成員名遵循標準的變量命名規范,注意這里有一個細節概念:作為類成員的__init__屬于函數,作為實例成員的__init__則屬于方法,在類中定義函數時約定首個參數為“self”,它會指向所生成的實例對象以便操作其成員,對應的實例方法則無此參數,所以調用Ship構造器時只需傳入一個參數(也可以不傳入任何參數,因為name指定了默認值)。除了實例屬性,你也可以定義新的實例方法,讓實例能夠做更多的事情——例如“船”類還有一個“船員加入”方法。
In [11]: help(Ship) Help on class Ship in module __main__: class Ship(builtins.object) | 船類 | | Methods defined here: | | __init__(self, name=None) | 初始化船實例 | | join(self, number) | 船員加入 | | ---------------------------------------------------------------------- | Data descriptors defined here: | | __dict__ | dictionary for instance variables (if defined) | | __weakref__ | list of weak references to the object (if defined) In [12]: type(Ship.__init__) Out[12]: function In [13]: type(s2.__init__) Out[13]: method In [14]: s1.__dict__ Out[14]: {'crew': 200, 'name': '鄭和'}
實例對象之所以擁有不必自定義而默認存在的特殊成員,是因為面向對象編程的一個重要特性“繼承”(Inheritance)——使用繼承機制能夠將復雜的系統有機地組織起來,所有類都是同一個龐大家族的成員——定義類時可以在類名后加括號指定“基類”,新類將成為其“子類”;如果不指定基類,就默認為最基本的“object”類的子類。子類會繼承基類的現有成員,子類定義屬性和方法時如果與基類成員同名,就會“覆蓋”基類成員。例如下面的程序定義了“船”類及其子類“戰艦”類:
"""ship.py 船的家族""" class Ship: """船類""" def __init__(self, name=None): """初始化船實例""" self.name = name # 船名 self.crew = 0 # 船員人數 def join(self, number): """船員加入""" self.crew += number return self.crew class Warship(Ship): """戰艦類""" def __init__(self, name=None, level=None): super().__init__(name) # 先調用基類初始化方法 self.level = level # 艦級 if __name__ == "__main__": ws1 = Warship("藍色空間", "恒星級") ws1.join(500) print("{}戰艦{}號,現有艦員{}人。".format(ws1.level, ws1.name, ws1.crew))
可以注意到Warship類重新定義了__init__,這就會覆蓋Ship類中的__init__,所以先調用基類的__init__才能繼承到基類定義的實例屬性name和crew。
接下來的示例是一個簡單的計算器:
"""tkcalc.pyw 簡單的計算器 """ import tkinter as tk class Calc(tk.Tk): """計算器窗體類""" def __init__(self): """初始化實例""" tk.Tk.__init__(self) self.title("計算器") self.memory = 0 # 暫存數值 self.create() def create(self): """創建界面""" btn_list = ["C", "M->", "->M", "/", "7", "8", "9", "*", "4", "5", "6", "-", "1", "2", "3", "+", "+/-", "0", ".", "="] r = 1 c = 0 for b in btn_list: self.button = tk.Button(self, text=b, width=5, command=(lambda x=b: self.click(x))) self.button.grid(row=r, column=c, padx=3, pady=6) c += 1 if c > 3: c = 0 r += 1 self.entry = tk.Entry(self, width=24, borderwidth=2, bg="yellow", font=("Consolas", 12)) self.entry.grid(row=0, column=0, columnspan=4, padx=8, pady=6) def click(self, key): """響應按鈕""" if key == "=": # 輸出結果 result = eval(self.entry.get()) self.entry.insert(tk.END, " = " + str(result)) elif key == "C": # 清空輸入框 self.entry.delete(0, tk.END) elif key == "->M": # 存入數值 self.memory = self.entry.get() if "=" in self.memory: ix = self.memory.find("=") self.memory = self.memory[ix + 2:] self.title("M=" + self.memory) elif key == "M->": # 取出數值 if self.memory: self.entry.insert(tk.END, self.memory) elif key == "+/-": # 正負翻轉 if "=" in self.entry.get(): self.entry.delete(0, tk.END) elif self.entry.get()[0] == "-": self.entry.delete(0) else: self.entry.insert(0, "-") else: # 其他鍵 if "=" in self.entry.get(): self.entry.delete(0, tk.END) self.entry.insert(tk.END, key) if __name__ == "__main__": Calc().mainloop()
以上是“Python面向對象的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。