真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python繼承函數(shù)重載 繼承的函數(shù)可以重載嗎

關(guān)于python的重載問題

沒有重載,但是可以有默認(rèn)參數(shù)和不定長參數(shù),可以判斷默認(rèn)值和參數(shù)長度來處理。

我們提供的服務(wù)有:成都網(wǎng)站制作、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、志丹ssl等。為上1000家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的志丹網(wǎng)站制作公司

比如:

def range(start, end = -1):

if end == -1:

end = start

start = 0

def range(*args):

if len(args) == 1:

start = 0

end = args[0]

elif len(args) == 2:

start, end = args[0], args[1]

為什么 Python 不支持函數(shù)重載

python是動(dòng)態(tài)腳本型語言,設(shè)計(jì)的機(jī)制就是按函數(shù)名來保存函數(shù)入口,而不是函數(shù)名+參數(shù)。

你調(diào)用函數(shù)的時(shí)候,可以多傳參數(shù),一樣的會調(diào)用到只是函數(shù)名匹配的那個(gè)函數(shù)。

python雖然不支持函數(shù)重載,但是可以通過傳遞容器類型的參數(shù)(list、tuple、set、dict)來實(shí)現(xiàn)類似的功能

如何解決python2不能隱式繼承

繼承是所有開發(fā)語言的必修內(nèi)容,而本文寫的只是Python繼承中的特殊之處,關(guān)于繼承概念及內(nèi)容可以自行百度(不裝B,感覺百度挺好的)1.構(gòu)造函數(shù):

要說繼承,先要說一下構(gòu)造函數(shù)。Java要求是與類名相同并且無返回值,而Python則是強(qiáng)制要求命名為“__init__()”。

當(dāng)創(chuàng)建類的對象時(shí),會自動(dòng)先調(diào)用構(gòu)造函數(shù),一般用于初始化。構(gòu)造函數(shù)可以不寫,那么程序會隱式自動(dòng)增加一個(gè)空的構(gòu)造函數(shù)。

2.繼承寫法:

(1).class 空格 類名稱 括號內(nèi)填寫父類名 冒號具體寫法如下class A:

def __init__(self):

pass

def print_class_name(self):

print "this is class A"

class B(A):

def __init__(self):

pass

if __name__ == "__main__":

class_b = B()

class_b.print_class_name()

上面代碼首先定義了一個(gè)名為“A”的類,包含一個(gè)名為“print_class_name”的方法。然后,定義一個(gè)名為“B”的類,繼承“A”,同時(shí)繼承了“A”類的“print_class_name”的方法。

此時(shí)“A”類為“B”類的父類或者叫基類,“B”類是“A”類的子類,子類會繼承父類的所有公共方法。

(2).意義:

一字記之曰“懶!”(感嘆號不算字)我始終相信賴人才能推動(dòng)科學(xué)進(jìn)步。

言歸正傳,假如你要寫一個(gè)老王類,包含年齡、性別等方法,后面還要寫一個(gè)老王的兒子小王類,也有年齡、性別等方法?

class FatherWang:

def __init__(self, age=43, sex='man'):

self.a = age

self.s = sex

def age(self):

print self.a

def sex(self):

print self.s

class SonWang:

def __init__(self, age=13, sex='man'):

self.a = age

self.s = sex

def age(self):

print self.a

def sex(self):

print self.s

if __name__ == "__main__":

father = FatherWang(43, "man")

father.age()

father.sex()

son = SonWang(13, "man")

son.age()

son.sex()

你會發(fā)現(xiàn)兩個(gè)類中有相同名稱和功能的方法,這樣寫豈不是很重復(fù)很累?(盡管按鍵盤次數(shù)不算太多,我依然覺得很累)如果有繼承就很好解決了。

class FatherWang:

def __init__(self, age=43, sex='man'):

self.a = age

self.s = sex

def age(self):

print self.a

def sex(self):

print self.s

class SonWang(FatherWang):

def __init__(self, age=13, sex='man'):

FatherWang.__init(age, sex)

if __name__ == "__main__":

father = FatherWang(43, "man")

father.age()

father.sex()

son = SonWang(13, "man")

son.age()

son.sex()

兩者運(yùn)行結(jié)果完全一樣,但是使用繼承方法卻省了很多按鍵盤的次數(shù)。

3.經(jīng)典類與新式類:

(1)經(jīng)典類寫法:

class A:

pass

(2)新式類寫法:

class A(object):

pass

可以看出,新式類和經(jīng)典類的區(qū)別在于,是否繼承object這個(gè)基類。object是所有類的父類。所以之前不帶“(object)”的寫法,屬于經(jīng)典類寫法,加上“(object)”就是新式類的寫法。

(3).原因:這里我得吐槽一下Python的版本混亂。2.2版本之前只有經(jīng)典類寫法,這里有一個(gè)問題,代碼如下?

class A:

pass

class B(object):

pass

a = A()

b = B()

print a.__class__

print type(a)

print "----------"

print b.__class__

print type(b)

結(jié)果為:

__main__.A

type 'instance'

----------

class '__main__.B'

class '__main__.B'

首先A類為經(jīng)典類,B類為新式類。__class__屬性和type()方法都是返回對象類型,那么問題來了,使用經(jīng)典類的寫法返回結(jié)果卻不一致。因此在2.2版本之后出現(xiàn)了新式類來解決這個(gè)問題,自然,新式類和經(jīng)典類還有更大的區(qū)別在后面說。另外在3.3版本中,無論使用哪種寫法,python都會隱式的繼承object,所以3.3版本不會再有經(jīng)典類(在這里我只想問,早干什么去了!),但是鑒于3.3兼容性問題,貌似沒有太多人用。

4.方法重寫與方法重載

(1).方法重寫:

class FatherWang:

def __init__(self, age=43, sex='man'):

self.a = age

self.s = sex

def age(self):

print self.a

def sex(self):

print self.s

def name(self):

print "Wang_yang"

class SonWang(FatherWang):

def __init__(self, age=13, sex='man'):

FatherWang.__init(age, sex)

def name(self):

print "Wang_xiaoming"

if __name__ == "__main__":

father = FatherWang(43, "man")

father.age()

father.sex()

father.name()

son = SonWang(13, "man")

son.age()

son.sex()

son.name()

比繼承寫法(2)中的代碼相比,兩個(gè)類分別多了同名的方法“name”,之前說過子類會繼承父類的方法,那么這時(shí)候兩個(gè)類有相同名字的方法,沖突了,怎么處理?

這個(gè)時(shí)候,就叫方法重寫??梢岳斫鉃?,子類的“name”方法把父類的“name”方法覆蓋了,重新寫了,所以調(diào)用子類的“name”方法時(shí),會以子類的為準(zhǔn)(盡管這種理解并不準(zhǔn)確,但是可以很好解釋“方法重寫”這個(gè)名詞,后面會講到正確理解)。

注意下面的代碼

class FatherWang:

def __init__(self, age=43, sex="man"):

self.a = age

self.s = sex

print "I am FatherWang"

def age(self):

print "Father age:"+str(self.a)

def sex(self):

print "Father sex:"+str(self.s)

class MotherLi:

def __init__(self, age=40, sex="woman"):

self.a = age

self.s = sex

print "I am MotherLi"

def age(self):

print "Mother age:"+str(self.a)

def sex(self):

print "Mother sex"+str(self.s)

class SonWang(FatherWang, MotherLi):

def __init__(self, age=13, sex="man"):

FatherWang.__init__(self, age, sex)

MotherLi.__init__(self, age, sex)

print "I am SonWang"

if __name__ == "__main__":

son = SonWang()

son.age()

son.sex()

執(zhí)行結(jié)果:

I am FatherWang

I am MotherLi

I am SonWang

Father age:13

Father sex:man

在之前代碼上稍作修改,另外增加了一個(gè)MotherLi的類,SonWang類繼承了FatherWang類和MotherLi類。注意,這是經(jīng)典類的寫法。

首先,我們知道了python多繼承的寫法,就是在括號中上一個(gè)父類后面加個(gè)逗號,然后再寫上下一個(gè)父類的名字:

class SonWang(FatherWang, MotherLi):

其次,F(xiàn)atherWang類和MotherLi類,都有名為age和sex方法,SonWang類為什么會繼承FatherWang類的方法呢?那么把SonWang類的繼承順序改一下class SonWang(MotherLi, FatherWang):

就會發(fā)現(xiàn)繼承的是MotherLi類的方法。

通過結(jié)果可知,是按照繼承的順序。

讓我們把代碼結(jié)構(gòu)變得更發(fā)雜一些吧,我想會崩潰的,哈哈哈?

class Grandfather:

def __init__(self, age=73, sex="man"):

self.a = age

self.s = sex

print "I am Grandfather"

def age(self):

print "Grandfather age:"+str(self.a)

def sex(self):

print "Grandfather sex:"+str(self.s)

def Interesting(self):

print "Grandfather Interesting"

class Grandmother:

def __init__(self, age=70, sex="woman"):

self.a = age

self.s = sex

print "I am Grandmother"

def age(self):

print "Grandmother age:"+str(self.a)

def sex(self):

print "Grandmother sex:"+str(self.s)

def Interesting(self):

print "Grandmother Interesting"

class FatherWang(Grandfather, Grandmother):

def __init__(self, age=43, sex="man"):

self.a = age

self.s = sex

Grandfather.__init__(self, age, sex)

Grandmother.__init__(self, age, sex)

print "I am FatherWang"

def age(self):

print "Father age:"+str(self.a)

def sex(self):

print "Father sex:"+str(self.s)

class MotherLi(Grandfather, Grandmother):

def __init__(self, age=40, sex="woman"):

self.a = age

self.s = sex

Grandfather.__init__(self, age, sex)

Grandmother.__init__(self, age, sex)

print "I am MotherLi"

def age(self):

print "Mother age:"+str(self.a)

def sex(self):

print "Mother sex"+str(self.s)

def Interesting(self):

print "MotherLi Interesting"

class SonWang(FatherWang, MotherLi):

def __init__(self, age=13, sex="man"):

FatherWang.__init__(self, age, sex)

MotherLi.__init__(self, age, sex)

print "I am SonWang"

if __name__ == "__main__":

son = SonWang()

son.age()

son.sex()

son.Interesting()

執(zhí)行結(jié)果:

I am Grandfather

I am Grandmother

I am FatherWang

I am Grandfather

I am Grandmother

I am MotherLi

I am SonWang

Father age:13

Father sex:man

Grandfather Interesting

話說,我自己都有點(diǎn)兒暈。簡單來講,就是兒子繼承了老爸、老媽,然后老爸繼承了爺爺、奶奶,媽媽繼承了老爺、姥姥。(真是一大家子?。┩ㄟ^執(zhí)行結(jié)果可知,兒子類先找到老爸類,然后再找老爸類的第1個(gè)父類爺爺類,此時(shí)發(fā)現(xiàn)爺爺類沒有父類了,那么執(zhí)行初始化。然后還要繼續(xù)找到老爸類的第2個(gè)父類奶奶類,此時(shí)發(fā)現(xiàn)奶奶類沒有父類了,執(zhí)行初始化。此時(shí)老爸類的所有父類都初始化完成,初始化自己。然后開始找媽媽類……那么為什么Interesting方法會使用爺爺類的呢?奶奶類、老爺類、姥姥類都有?。渴紫葍鹤宇悰]有Interesting方法,會先找第1個(gè)父類老爸類。發(fā)現(xiàn)老爸類也沒有,再找老爸類的第1個(gè)父類,發(fā)現(xiàn)找到了,那么就直接調(diào)用不再往下找了。

結(jié)論:經(jīng)典類的多繼承,按照繼承順序查找。即,從左到右,從下到上的方式。注意,只有經(jīng)典類是這樣的!

(2).新式類的多繼承:

class Grandfather(object):

def __init__(self, age=73, sex="man"):

self.a = age

self.s = sex

print "I am Grandfather"

def age(self):

print "Grandfather age:"+str(self.a)

def sex(self):

print "Grandfather sex:"+str(self.s)

def Interesting(self):

print "Grandfather Interesting"

class Grandmother(object):

def __init__(self, age=70, sex="woman"):

self.a = age

self.s = sex

print "I am Grandmother"

def age(self):

print "Grandmother age:"+str(self.a)

def sex(self):

print "Grandmother sex:"+str(self.s)

def Interesting(self):

print "Grandmother Interesting"

class FatherWang(Grandfather, Grandmother):

def __init__(self, age=43, sex="man"):

self.a = age

self.s = sex

Grandfather.__init__(self, age, sex)

Grandmother.__init__(self, age, sex)

print "I am FatherWang"

def age(self):

print "Father age:"+str(self.a)

def sex(self):

print "Father sex:"+str(self.s)

class MotherLi(Grandfather, Grandmother):

def __init__(self, age=40, sex="woman"):

self.a = age

self.s = sex

Grandfather.__init__(self, age, sex)

Grandmother.__init__(self, age, sex)

print "I am MotherLi"

def age(self):

print "Mother age:"+str(self.a)

def sex(self):

print "Mother sex"+str(self.s)

def Interesting(self):

print "MotherLi Interesting"

class SonWang(FatherWang, MotherLi):

def __init__(self, age=13, sex="man"):

FatherWang.__init__(self, age, sex)

MotherLi.__init__(self, age, sex)

print "I am SonWang"

if __name__ == "__main__":

son = SonWang()

son.age()

son.sex()

son.Interesting()

執(zhí)行結(jié)果:

I am Grandfather

I am Grandmother

I am FatherWang

I am Grandfather

I am Grandmother

I am MotherLi

I am SonWang

Father age:13

Father sex:man

MotherLi Interesting

python中的super是什么?-

目錄

python中的super,名為超類,可以簡單的理解為執(zhí)行父類的__init__函數(shù)。由于在python中不論是一對一的繼承,還是一子類繼承多個(gè)父類,都會涉及到執(zhí)行的先后順序的問題。那么本文就著重看下super的具體作用。

通過設(shè)計(jì)這樣一個(gè)案例,我們可以明確super的前后邏輯關(guān)系:先定義一個(gè)父類 initial ,在這個(gè)父類中有參數(shù)值 param 和函數(shù) func ,然后用子類 new 來繼承父類 initial 。繼承之后,在子類的 __init__ 函數(shù)中 super 執(zhí)行的前后去打印參數(shù)值 param 和函數(shù) func 的返回值,相關(guān)代碼如下所示:

代碼的執(zhí)行結(jié)果如下所示:

首先我們注意到,父類 initial 中的 __init__ 函數(shù)內(nèi)的打印語句,是在super之后才輸出的,這說明了, super 函數(shù)是在執(zhí)行父類的初始化操作。那么如果沒有執(zhí)行 super , new 子類對 initial 父類的繼承體現(xiàn)在哪里呢?答案就是父類的成員函數(shù),比如這樣的一個(gè)案例:

其實(shí)就是刪掉了子類中重載的成員函數(shù),那么得到的結(jié)果如下:

可以發(fā)現(xiàn)在執(zhí)行super之前就可以打印父類的 func 函數(shù)的函數(shù)值。所以python中繼承的邏輯是這樣的:

initial.func() new.__init__() new.func()/new.param super() initial.__init__()/initial.param new.__init__()/new.paraminitial.func() new.__init__() new.func()/new.param super() initial.__init__()/initial.param new.__init__()/new.param

也正是因?yàn)橹挥袌?zhí)行了 super 才能初始化父類中的成員變量,因此如果在super之前是無法訪問父類的成員變量的。

本文通過一個(gè)python的實(shí)際案例的設(shè)計(jì),來講解python面向?qū)ο蟮募夹g(shù)——類的繼承中必用的super函數(shù)的邏輯。其實(shí)我們可以把python中類的繼承理解成這樣的一個(gè)過程:當(dāng)我們在括號中明確了父類時(shí),其實(shí)已經(jīng)引用了父類的成員函數(shù),但是并沒有執(zhí)行父類的初始化函數(shù)。在執(zhí)行子類的初始化函數(shù)的同時(shí),會檢查是否重載了父類的成員函數(shù),如果重載則會直接覆蓋。而只有在執(zhí)行了super之后,才相當(dāng)于執(zhí)行了父類的初始化函數(shù),此時(shí)才可以訪問父類的成員變量。

本文首發(fā)鏈接為:

作者ID:DechinPhy

更多原著文章請參考:

打賞專用鏈接:

騰訊云專欄同步:

python類的繼承和單例模式 singleton、運(yùn)算符重載

@[toc]

全局只有一個(gè)實(shí)例

font color=#03a3e3 該實(shí)現(xiàn)方式在多線程場景下不安全

繼承其他類的類稱為派生類(derived class)

被其他類繼承的類稱為這些類的基類(base

class)

需要注意圓括號中基類的順序:font color=#03a3e3 從左到右搜索 font

多繼承會導(dǎo)致菱形 diamond關(guān)系:有至少一個(gè)基類可以從子類經(jīng)由多個(gè)繼承路徑到達(dá)

基類方法可能被多次調(diào)用

防止重復(fù)訪問,每個(gè)基類只調(diào)用一次

通過子類實(shí)例對象課調(diào)用父類已被覆蓋

慎用多繼承(二義性)

– 對已有的運(yùn)算符重新進(jìn)行定義,賦予其另一種功能,以適應(yīng)不同的數(shù)據(jù)類型

– 運(yùn)算符重載不能改變其本來寓意

– 運(yùn)算符重載只是一種 “語法上的方便” (sugar)

– 是一種函數(shù)調(diào)用的方式

python 重載方法有哪些特點(diǎn)

說起python重載,大家學(xué)過其他的語言比如說C#語言的話,應(yīng)該知道有方法重載和運(yùn)算符重載的概念,但是python重載的話,有它自己的特殊性,下面我說說自己的一點(diǎn)看法,希望大家踴躍拍磚。python 的重載主要包括方法重載和運(yùn)算符重載。1.python 方法重載: 其他的語言一般對于方法重載的話,主要是根據(jù)參數(shù)的類型不同或者是數(shù)量不同來區(qū)分同名的方法。而python則比較特殊,它本身是動(dòng)態(tài)語言,方法的參數(shù)是沒有類型的,當(dāng)調(diào)用傳值的時(shí)候才確定參數(shù)的類型,故對參數(shù)類型不同的方法無需考慮重載。對參數(shù)數(shù)量不同的方法,則(大多數(shù)情況下)可以采用參數(shù)默認(rèn)值來實(shí)現(xiàn)。比如你可以定義函數(shù)的默認(rèn)值:def info(x,y,z=1): pass2.python 運(yùn)算符重載: 在C#中,我們通過使用關(guān)鍵字operator定義一個(gè)運(yùn)算符方法,并定義與所在類相關(guān)的運(yùn)算符行為。在 Python中,運(yùn)算符重載的方式更為簡單——每一個(gè)類都默認(rèn)內(nèi)置了所有可能的運(yùn)算符方法,只要重寫這個(gè)方法,就可以實(shí)現(xiàn)針對該運(yùn)算符的重載。例如以下是重載加法操作:class Info(object): def __init__(self): self.a = 11 self.b = 22 def __add__(self,x): return self.a * self.b 上面的例子是重寫了+操作符號,你也可以重載其他的運(yùn)算符。比如你可以重載乘號運(yùn)算符,感興趣的話,可以自己寫寫代碼。希望上面講的2點(diǎn)能夠讓你對python重載有個(gè)簡單的認(rèn)識。有興趣的可以關(guān)注下。


網(wǎng)站題目:python繼承函數(shù)重載 繼承的函數(shù)可以重載嗎
本文網(wǎng)址:http://weahome.cn/article/hhoehd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部