函數(shù)繼承python 函數(shù)繼承函數(shù)

python 類和繼承,包及模塊導(dǎo)入 求解答

一 .module

超過(guò)10余年行業(yè)經(jīng)驗(yàn),技術(shù)領(lǐng)先,服務(wù)至上的經(jīng)營(yíng)模式,全靠網(wǎng)絡(luò)和口碑獲得客戶,為自己降低成本,也就是為客戶降低成本。到目前業(yè)務(wù)范圍包括了:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作,成都網(wǎng)站推廣,成都網(wǎng)站優(yōu)化,整體網(wǎng)絡(luò)托管,微信小程序,微信開(kāi)發(fā),成都app軟件開(kāi)發(fā),同時(shí)也可以讓客戶的網(wǎng)站和網(wǎng)絡(luò)營(yíng)銷和我們一樣獲得訂單和生意!

通常模塊為一個(gè)文件,直接使用import來(lái)導(dǎo)入就好了??梢宰鳛閙odule的文件類型有".py"、".pyo"、".pyc"、".pyd"、".so"、".dll"。

二. package

通常包總是一個(gè)目錄,可以使用import導(dǎo)入包,或者from + import來(lái)導(dǎo)入包中的部分模塊。包目錄下為首的一個(gè)文件便是 __init__.py。然后是一些模塊文件和子目錄,假如子目錄中也有 __init__.py 那么它就是這個(gè)包的子包了。

一.模塊你可以使用import語(yǔ)句將一個(gè)源代碼文件作為模塊導(dǎo)入.例如:

[python]?view plain?copy

#?file?:?spam.py

a?=?37????????????????????#?一個(gè)變量

def?foo:??????????????????#?一個(gè)函數(shù)

print?"I'm?foo"

class?bar:????????????????#?一個(gè)類

def?grok(self):

print?"I'm?bar.grok"

b?=?bar()?????????????????#?創(chuàng)建一個(gè)實(shí)例

使用import spam 語(yǔ)句就可以將這個(gè)文件作為模塊導(dǎo)入。系統(tǒng)在導(dǎo)入模塊時(shí),要做以下三件事:

1.為源代碼文件中定義的對(duì)象創(chuàng)建一個(gè)名字空間,通過(guò)這個(gè)名字空間可以訪問(wèn)到模塊中定義的函數(shù)及變量。

2.在新創(chuàng)建的名字空間里執(zhí)行源代碼文件.

3.創(chuàng)建一個(gè)名為源代碼文件的對(duì)象,該對(duì)象引用模塊的名字空間,這樣就可以通過(guò)這個(gè)對(duì)象訪問(wèn)模塊中的函數(shù)及變量,如: ?

[python]?view plain?copy

import?spam???????????#?導(dǎo)入并運(yùn)行模塊?spam

print?spam.a??????????#?訪問(wèn)模塊?spam?的屬性

spam.foo()

c?=?spam.bar()

用逗號(hào)分割模塊名稱就可以同時(shí)導(dǎo)入多個(gè)模塊:

[python]?view plain?copy

import?socket,?os,?regex

模塊導(dǎo)入時(shí)可以使用 as 關(guān)鍵字來(lái)改變模塊的引用對(duì)象名字:

[python]?view plain?copy

import?os?as?system

import?socket?as?net,?thread?as?threads

system.chdir("..")

net.gethostname()

使用from語(yǔ)句可以將模塊中的對(duì)象直接導(dǎo)入到當(dāng)前的名字空間. from語(yǔ)句不創(chuàng)建一個(gè)到模塊名字空間的引用對(duì)象,而是把被導(dǎo)入模塊的一個(gè)或多個(gè)對(duì)象直接放入當(dāng)前的名字空間:

[python]?view plain?copy

from?socket?import?gethostname?#?將gethostname放如當(dāng)前名字空間

print?gethostname()????????????#?直接調(diào)用

socket.gethostname()???????????#?引發(fā)異常NameError:?socket

from語(yǔ)句支持逗號(hào)分割的對(duì)象,也可以使用星號(hào)(*)代表模塊中除下劃線開(kāi)頭的所有對(duì)象:

[python]?view plain?copy

from?socket?import?gethostname,?socket

from?socket?import?*???#?載入所有對(duì)象到當(dāng)前名字空間

不過(guò),如果一個(gè)模塊如果定義有列表__all__,則from module import * 語(yǔ)句只能導(dǎo)入__all__列表中存在的對(duì)象。

[python]?view plain?copy

#?module:?foo.py

__all__?=?[?'bar',?'spam'?]?????#?定義使用?`*`?可以導(dǎo)入的對(duì)象

另外, as 也可以和 from 聯(lián)合使用:

[python]?view plain?copy

from?socket?import?gethostname?as?hostname

h?=?hostname()

import 語(yǔ)句可以在程序的任何位置使用,你可以在程序中多次導(dǎo)入同一個(gè)模塊,但模塊中的代碼*僅僅*在該模塊被首次導(dǎo)入時(shí)執(zhí)行。后面的import語(yǔ)句只是簡(jiǎn)單的創(chuàng)建一個(gè)到模塊名字空間的引用而已。sys.modules字典中保存著所有被導(dǎo)入模塊的模塊名到模塊對(duì)象的映射。這個(gè)字典用來(lái)決定是否需要使用import語(yǔ)句來(lái)導(dǎo)入一個(gè)模塊的最新拷貝.

from module import * 語(yǔ)句只能用于一個(gè)模塊的最頂層.*特別注意*:由于存在作用域沖突,不允許在函數(shù)中使用from 語(yǔ)句。?

每個(gè)模塊都擁有 __name__ 屬性,它是一個(gè)內(nèi)容為模塊名字的字符串。最頂層的模塊名稱是 __main__ .命令行或是交互模式下程序都運(yùn)行在__main__ 模塊內(nèi)部. 利用__name__屬性,我們可以讓同一個(gè)程序在不同的場(chǎng)合(單獨(dú)執(zhí)行或被導(dǎo)入)具有不同的行為,象下面這樣做:

[python]?view plain?copy

#?檢查是單獨(dú)執(zhí)行還是被導(dǎo)入

if?__name__?==?'__main__':

#?Yes

statements

else:

#?No?(可能被作為模塊導(dǎo)入)

statements

模塊搜索路徑

導(dǎo)入模塊時(shí),解釋器會(huì)搜索sys.path列表,這個(gè)列表中保存著一系列目錄。一個(gè)典型的sys.path 列表的值:

Linux:

['', '/usr/local/lib/python2.0',

'/usr/local/lib/python2.0/plat-sunos5',

'/usr/local/lib/python2.0/lib-tk',

'/usr/local/lib/python2.0/lib-dynload',

'/usr/local/lib/python2.0/site-packages']

Windows:

['', 'C:\\WINDOWS\\system32\\python24.zip', 'C:\\Documents and Settings\\weizhong', 'C:\\Python24\\DLLs', 'C:\\Python24\\lib', 'C:\\Python24\\lib\\plat-win', 'C:\\Python24\\lib\\lib-tk', 'C:\\Python24\\Lib\\site-packages\\pythonwin', 'C:\\Python24', 'C:\\Python24\\lib\\site-packages', 'C:\\Python24\\lib\\site-packages\\win32', 'C:\\Python24\\lib\\site-packages\\win32\\lib', 'C:\\Python24\\lib\\site-packages\\wx-2.6-msw-unicode']

空字符串 代表當(dāng)前目錄. 要加入新的搜索路徑,只需要將這個(gè)路徑加入到這個(gè)列表.?

模塊導(dǎo)入和匯編

到現(xiàn)在為止,本章介紹的模塊都是包含Python源代碼的文本文件. 不過(guò)模塊不限于此,可以被 import 語(yǔ)句導(dǎo)入的模塊共有以下四類:?

?使用Python寫(xiě)的程序( .py文件)

?C或C++擴(kuò)展(已編譯為共享庫(kù)或DLL文件)

?包(包含多個(gè)模塊)

?內(nèi)建模塊(使用C編寫(xiě)并已鏈接到Python解釋器內(nèi))

當(dāng)查詢模塊 foo 時(shí),解釋器按照 sys.path 列表中目錄順序來(lái)查找以下文件(目錄也是文件的一種):?

1.定義為一個(gè)包的目錄 foo

2.foo.so, foomodule.so, foomodule.sl,或 foomodule.dll (已編譯擴(kuò)展)

3.foo.pyo (只在使用 -O 或 -OO 選項(xiàng)時(shí))

4.foo.pyc

5.foo.py

對(duì)于.py文件,當(dāng)一個(gè)模塊第一次被導(dǎo)入時(shí),它就被匯編為字節(jié)代碼,并將字節(jié)碼寫(xiě)入一個(gè)同名的 .pyc文件.后來(lái)的導(dǎo)入操作會(huì)直接讀取.pyc文件而不是.py文件.(除非.py文件的修改日期更新,這種情況會(huì)重新生成.pyc文件) 在解釋器使用 -O 選項(xiàng)時(shí),擴(kuò)展名為.pyo的同名文件被使用. pyo文件的內(nèi)容雖去掉行號(hào),斷言,及其他調(diào)試信息的字節(jié)碼,體積更小,運(yùn)行速度更快.如果使用-OO選項(xiàng)代替-O,則文檔字符串也會(huì)在創(chuàng)建.pyo文件時(shí)也被忽略.

如果在sys.path提供的所有路徑均查找失敗,解釋器會(huì)繼續(xù)在內(nèi)建模塊中尋找,如果再次失敗,則引發(fā) ImportError 異常.?

.pyc和.pyo文件的匯編,當(dāng)且僅當(dāng)import 語(yǔ)句執(zhí)行時(shí)進(jìn)行.?

當(dāng) import 語(yǔ)句搜索文件時(shí),文件名是大小寫(xiě)敏感的。即使在文件系統(tǒng)大小寫(xiě)不敏感的系統(tǒng)上也是如此(Windows等). 這樣, import foo 只會(huì)導(dǎo)入文件foo.py而不會(huì)是FOO.PY.

重新導(dǎo)入模塊

如果更新了一個(gè)已經(jīng)用import語(yǔ)句導(dǎo)入的模塊,內(nèi)建函數(shù)reload()可以重新導(dǎo)入并運(yùn)行更新后的模塊代碼.它需要一個(gè)模塊對(duì)象做為參數(shù).例如:?

import foo

... some code ...

reload(foo)????????? # 重新導(dǎo)入 foo

在reload()運(yùn)行之后的針對(duì)模塊的操作都會(huì)使用新導(dǎo)入代碼,不過(guò)reload()并不會(huì)更新使用舊模塊創(chuàng)建的對(duì)象,因此有可能出現(xiàn)新舊版本對(duì)象共存的情況。 *注意* 使用C或C++編譯的模塊不能通過(guò) reload() 函數(shù)來(lái)重新導(dǎo)入。記住一個(gè)原則,除非是在調(diào)試和開(kāi)發(fā)過(guò)程中,否則不要使用reload()函數(shù).

pyqt5 繼承python類可以傳遞信號(hào)函數(shù)嗎

可以。

在pyqt5編程過(guò)程中,經(jīng)常會(huì)遇到輸入或選擇多個(gè)參數(shù)的問(wèn)題,把多個(gè)參數(shù)寫(xiě)到一個(gè)窗口中,主窗口會(huì)顯得很臃腫,所以,一般是添加一個(gè)按鈕,調(diào)用對(duì)話框,在對(duì)話框中進(jìn)行參數(shù)的選擇,關(guān)閉對(duì)話框?qū)?shù)返回給主窗口

pyqt提供了一些標(biāo)準(zhǔn)的對(duì)話框類,用于輸入數(shù)據(jù),修改數(shù)據(jù),更改應(yīng)用的設(shè)置等,常見(jiàn)的有QFileDialog,QInputDialog,QColorDialog, QFontDialog等,在不同的窗口之間傳參數(shù)有兩種常用的方式,一種在自定義對(duì)話框之間通過(guò)屬性傳參,另一種在窗口之間使用信號(hào)與槽機(jī)制傳參,這里主要介紹第一種

單一窗口的數(shù)據(jù)傳遞實(shí)例

對(duì)于具有單一窗口的程序來(lái)說(shuō),一個(gè)控件的變化會(huì)影響另一個(gè)控件的變化,這中變化利用信號(hào)與槽的關(guān)系非常容易解決

Python子類繼承,如果不用父類的函數(shù)和方法,應(yīng)該怎么寫(xiě)?

子類繼承父類時(shí),如果父類有需要初始化的屬性,那么必須在子類中調(diào)用父類的初始化方法,幫助父類進(jìn)行初始化,否則,子類可以不調(diào)用父類的初始化方法

代碼示例

"""

父類Car中沒(méi)有屬性需要初始化,所有子類中也不需要調(diào)用父類的初始化方法

"""

class?Car:

def?show_name(self):

print('car?name')

class?EeleCar(Car):

pass

car?=?EeleCar()

car.show_name()

Python面向?qū)ο缶幊讨^承與多態(tài)詳解

Python面向?qū)ο缶幊讨^承與多態(tài)詳解

本文實(shí)例講述了Python面向?qū)ο缶幊讨^承與多態(tài)。分享給大家供大家參考,具體如下:

Python 類的繼承

在OOP(Object Oriented Programming)程序設(shè)計(jì)中,當(dāng)我們定義一個(gè)class的時(shí)候,可以從某個(gè)現(xiàn)有的class 繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Base class、Super class)。

我們先來(lái)定義一個(gè)class Person,表示人,定義屬性變量 name 及 sex (姓名和性別);

定義一個(gè)方法print_title():當(dāng)sex是male時(shí),print man;當(dāng)sex 是female時(shí),print woman。參考如下代碼:

class Person(object):

def __init__(self,name,sex):

self.name = name

self.sex = sex

def print_title(self):

if self.sex == "male":

print("man")

elif self.sex == "female":

print("woman")

class Child(Person): # Child 繼承 Person

pass

May = Child("May","female")

Peter = Person("Peter","male")

print(May.name,May.sex,Peter.name,Peter.sex) # 子類繼承父類方法及屬性

May.print_title()

Peter.print_title()

而我們編寫(xiě) Child 類,完全可以繼承 Person 類(Child 就是 Person);使用 class subclass_name(baseclass_name) 來(lái)表示繼承;

繼承有什么好處?最大的好處是子類獲得了父類的全部屬性及功能。如下 Child 類就可以直接使用父類的 print_title() 方法

實(shí)例化Child的時(shí)候,子類繼承了父類的構(gòu)造函數(shù),就需要提供父類Person要求的兩個(gè)屬性變量 name 及 sex:

在繼承關(guān)系中,如果一個(gè)實(shí)例的數(shù)據(jù)類型是某個(gè)子類,那它也可以被看做是父類(May 既是 Child 又是 Person)。但是,反過(guò)來(lái)就不行(Peter 僅是 Person,而不是Child)。

繼承還可以一級(jí)一級(jí)地繼承下來(lái),就好比從爺爺?shù)桨职帧⒃俚絻鹤舆@樣的關(guān)系。而任何類,最終都可以追溯到根類object,這些繼承關(guān)系看上去就像一顆倒著的樹(shù)。比如如下的繼承樹(shù):

isinstance() 及 issubclass()

Python 與其他語(yǔ)言不同點(diǎn)在于,當(dāng)我們定義一個(gè) class 的時(shí)候,我們實(shí)際上就定義了一種數(shù)據(jù)類型。我們定義的數(shù)據(jù)類型和Python自帶的數(shù)據(jù)類型,比如str、list、dict沒(méi)什么兩樣。

Python 有兩個(gè)判斷繼承的函數(shù):isinstance() 用于檢查實(shí)例類型;issubclass() 用于檢查類繼承。參見(jiàn)下方示例:

class Person(object):

pass

class Child(Person): # Child 繼承 Person

pass

May = Child()

Peter = Person()

print(isinstance(May,Child)) # True

print(isinstance(May,Person)) # True

print(isinstance(Peter,Child)) # False

print(isinstance(Peter,Person)) # True

print(issubclass(Child,Person)) # True

Python 類的多態(tài)

在說(shuō)明多態(tài)是什么之前,我們?cè)?Child 類中重寫(xiě) print_title() 方法:若為male,print boy;若為female,print girl

class Person(object):

def __init__(self,name,sex):

self.name = name

self.sex = sex

def print_title(self):

if self.sex == "male":

print("man")

elif self.sex == "female":

print("woman")

class Child(Person): # Child 繼承 Person

def print_title(self):

if self.sex == "male":

print("boy")

elif self.sex == "female":

print("girl")

May = Child("May","female")

Peter = Person("Peter","male")

print(May.name,May.sex,Peter.name,Peter.sex)

May.print_title()

Peter.print_title()

當(dāng)子類和父類都存在相同的 print_title()方法時(shí),子類的 print_title() 覆蓋了父類的 print_title(),在代碼運(yùn)行時(shí),會(huì)調(diào)用子類的 print_title()

這樣,我們就獲得了繼承的另一個(gè)好處:多態(tài)。

多態(tài)的好處就是,當(dāng)我們需要傳入更多的子類,例如新增 Teenagers、Grownups 等時(shí),我們只需要繼承 Person 類型就可以了,而print_title()方法既可以直不重寫(xiě)(即使用Person的),也可以重寫(xiě)一個(gè)特有的。這就是多態(tài)的意思。調(diào)用方只管調(diào)用,不管細(xì)節(jié),而當(dāng)我們新增一種Person的子類時(shí),只要確保新方法編寫(xiě)正確,而不用管原來(lái)的代碼。這就是著名的“開(kāi)閉”原則:

對(duì)擴(kuò)展開(kāi)放(Open for extension):允許子類重寫(xiě)方法函數(shù)

對(duì)修改封閉(Closed for modification):不重寫(xiě),直接繼承父類方法函數(shù)

子類重寫(xiě)構(gòu)造函數(shù)

子類可以沒(méi)有構(gòu)造函數(shù),表示同父類構(gòu)造一致;子類也可重寫(xiě)構(gòu)造函數(shù);現(xiàn)在,我們需要在子類 Child 中新增兩個(gè)屬性變量:mother 和 father,我們可以構(gòu)造如下(建議子類調(diào)用父類的構(gòu)造方法,參見(jiàn)后續(xù)代碼):

class Person(object):

def __init__(self,name,sex):

self.name = name

self.sex = sex

class Child(Person): # Child 繼承 Person

def __init__(self,name,sex,mother,father):

self.name = name

self.sex = sex

self.mother = mother

self.father = father

May = Child("May","female","April","June")

print(May.name,May.sex,May.mother,May.father)

若父類構(gòu)造函數(shù)包含很多屬性,子類僅需新增1、2個(gè),會(huì)有不少冗余的代碼,這邊,子類可對(duì)父類的構(gòu)造方法進(jìn)行調(diào)用,參考如下:

class Person(object):

def __init__(self,name,sex):

self.name = name

self.sex = sex

class Child(Person): # Child 繼承 Person

def __init__(self,name,sex,mother,father):

Person.__init__(self,name,sex) # 子類對(duì)父類的構(gòu)造方法的調(diào)用

self.mother = mother

self.father = father

May = Child("May","female","April","June")

print(May.name,May.sex,May.mother,May.father)

多重繼承

多重繼承的概念應(yīng)該比較好理解,比如現(xiàn)在需要新建一個(gè)類 baby 繼承 Child , 可繼承父類及父類上層類的屬性及方法,優(yōu)先使用層類近的方法,代碼參考如下:

class Person(object):

def __init__(self,name,sex):

self.name = name

self.sex = sex

def print_title(self):

if self.sex == "male":

print("man")

elif self.sex == "female":

print("woman")

class Child(Person):

pass

class Baby(Child):

pass

May = Baby("May","female") # 繼承上上層父類的屬性

print(May.name,May.sex)

May.print_title() # 可使用上上層父類的方法

class Child(Person):

def print_title(self):

if self.sex == "male":

print("boy")

elif self.sex == "female":

print("girl")

class Baby(Child):

pass

May = Baby("May","female")

May.print_title() # 優(yōu)先使用上層類的方法

分享名稱:函數(shù)繼承python 函數(shù)繼承函數(shù)
標(biāo)題來(lái)源:http://www.muchs.cn/article42/hggeec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、網(wǎng)站設(shè)計(jì)公司、品牌網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、標(biāo)簽優(yōu)化、虛擬主機(jī)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司