小編給大家分享一下Python面向?qū)ο蟮氖纠治觯嘈糯蟛糠秩硕歼€不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供黔西南州網(wǎng)站建設(shè)、黔西南州做網(wǎng)站、黔西南州網(wǎng)站設(shè)計(jì)、黔西南州網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、黔西南州企業(yè)網(wǎng)站模板建站服務(wù),10年黔西南州做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
我們已經(jīng)知道在Python中“一切皆對象”,每個(gè)對象都有特定的類型,現(xiàn)在讓我們來嘗試創(chuàng)建自己的類型——這需要使用class關(guān)鍵字來定義新的“類”(Class),類是用來生成對象的“模板”,對象則是其所屬類的“實(shí)例”——以下是在交互模式中自定義Thing類,并調(diào)用其默認(rèn)構(gòu)造器生成一個(gè)Thing類的實(shí)例對象(注意:自定義類的命名規(guī)范要求單詞首字母大寫):
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類的一個(gè)實(shí)例;t對象屬于Thing類型,是Thing類的一個(gè)實(shí)例——當(dāng)你在程序中定義自己的類來生成實(shí)例對象,就算是“面向?qū)ο缶幊獭保∣bject-Oriented Programming,簡稱OOP)。面向?qū)ο蟮木幊谭绞绞褂妙悂砟M和組織現(xiàn)實(shí)世界的事物,可以令程序結(jié)構(gòu)更靈活、條理更清晰。
上面定義的Thing類所生成的實(shí)例對象并不能做什么事情,讓我們再來創(chuàng)建一個(gè)包含了具體子語句的“船”類并生成兩個(gè)“船”對象:
In [5]: class Ship:
...: """船類"""
...: def __init__(self, name=None):
...: """初始化船實(shí)例"""
...: self.name = name # 船名
...: self.crew = 0 # 船員人數(shù)
...: 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]: 100Ship類定義了一個(gè)特殊的“初始化”方法__init__,這樣就能在調(diào)用構(gòu)造器生成實(shí)例時(shí)加入新的實(shí)例“屬性”(Property),所謂實(shí)例屬性就是實(shí)例對象的“成員變量”,例如Ship類的實(shí)例增加了name和crew屬性——從現(xiàn)實(shí)概念來理解,任何船都有船名和船員人數(shù)這兩個(gè)數(shù)據(jù),但每艘船又有各自的具體數(shù)據(jù)值。實(shí)例屬性和實(shí)例方法是最常見的兩種類成員,Python規(guī)定特殊類成員名以兩個(gè)下劃線開始和結(jié)束,其他類成員名遵循標(biāo)準(zhǔn)的變量命名規(guī)范,注意這里有一個(gè)細(xì)節(jié)概念:作為類成員的__init__屬于函數(shù),作為實(shí)例成員的__init__則屬于方法,在類中定義函數(shù)時(shí)約定首個(gè)參數(shù)為“self”,它會指向所生成的實(shí)例對象以便操作其成員,對應(yīng)的實(shí)例方法則無此參數(shù),所以調(diào)用Ship構(gòu)造器時(shí)只需傳入一個(gè)參數(shù)(也可以不傳入任何參數(shù),因?yàn)閚ame指定了默認(rèn)值)。除了實(shí)例屬性,你也可以定義新的實(shí)例方法,讓實(shí)例能夠做更多的事情——例如“船”類還有一個(gè)“船員加入”方法。
In [11]: help(Ship)
Help on class Ship in module __main__:
class Ship(builtins.object)
| 船類
|
| Methods defined here:
|
| __init__(self, name=None)
| 初始化船實(shí)例
|
| 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': '鄭和'}實(shí)例對象之所以擁有不必自定義而默認(rèn)存在的特殊成員,是因?yàn)槊嫦驅(qū)ο缶幊痰囊粋€(gè)重要特性“繼承”(Inheritance)——使用繼承機(jī)制能夠?qū)?fù)雜的系統(tǒng)有機(jī)地組織起來,所有類都是同一個(gè)龐大家族的成員——定義類時(shí)可以在類名后加括號指定“基類”,新類將成為其“子類”;如果不指定基類,就默認(rèn)為最基本的“object”類的子類。子類會繼承基類的現(xiàn)有成員,子類定義屬性和方法時(shí)如果與基類成員同名,就會“覆蓋”基類成員。例如下面的程序定義了“船”類及其子類“戰(zhàn)艦”類:
"""ship.py 船的家族"""
class Ship:
"""船類"""
def __init__(self, name=None):
"""初始化船實(shí)例"""
self.name = name # 船名
self.crew = 0 # 船員人數(shù)
def join(self, number):
"""船員加入"""
self.crew += number
return self.crew
class Warship(Ship):
"""戰(zhàn)艦類"""
def __init__(self, name=None, level=None):
super().__init__(name) # 先調(diào)用基類初始化方法
self.level = level # 艦級
if __name__ == "__main__":
ws1 = Warship("藍(lán)色空間", "恒星級")
ws1.join(500)
print("{}戰(zhàn)艦{}號,現(xiàn)有艦員{}人。".format(ws1.level, ws1.name, ws1.crew))可以注意到Warship類重新定義了__init__,這就會覆蓋Ship類中的__init__,所以先調(diào)用基類的__init__才能繼承到基類定義的實(shí)例屬性name和crew。
接下來的示例是一個(gè)簡單的計(jì)算器:
"""tkcalc.pyw 簡單的計(jì)算器
"""
import tkinter as tk
class Calc(tk.Tk):
"""計(jì)算器窗體類"""
def __init__(self):
"""初始化實(shí)例"""
tk.Tk.__init__(self)
self.title("計(jì)算器")
self.memory = 0 # 暫存數(shù)值
self.create()
def create(self):
"""創(chuàng)建界面"""
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):
"""響應(yīng)按鈕"""
if key == "=": # 輸出結(jié)果
result = eval(self.entry.get())
self.entry.insert(tk.END, " = " + str(result))
elif key == "C": # 清空輸入框
self.entry.delete(0, tk.END)
elif key == "->M": # 存入數(shù)值
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->": # 取出數(shù)值
if self.memory:
self.entry.insert(tk.END, self.memory)
elif key == "+/-": # 正負(fù)翻轉(zhuǎn)
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面向?qū)ο蟮氖纠治?/a>
瀏覽地址:http://www.chinadenli.net/article40/gpdseo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁設(shè)計(jì)公司、搜索引擎優(yōu)化、外貿(mào)建站、企業(yè)建站、網(wǎng)站維護(hù)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)