python面試題小結(jié)附答案實(shí)例代碼
1 談?wù)勀銓?duì)面向?qū)ο蟮睦斫猓?/strong>
面向?qū)ο蟮木幊?--object oriented programming,簡(jiǎn)稱(chēng):OOP,是一種編程的思想。OOP把對(duì)象當(dāng)成一個(gè)程序的基本單元,一個(gè)對(duì)象包含了數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)。面向?qū)ο蟮某霈F(xiàn)極大的提高了編程的效率,使其編程的重用性增高。
python面向?qū)ο蟮闹匾g(shù)語(yǔ):
多態(tài)(polymorphism):一個(gè)函數(shù)有多種表現(xiàn)形式,調(diào)用一個(gè)方法有多種形式,但是表現(xiàn)出的方法是不一樣的。
繼承(inheritance)子項(xiàng)繼承父項(xiàng)的某些功能,在程序中表現(xiàn)某種聯(lián)系
封裝(encapsulation)把需要重用的函數(shù)或者功能封裝,方便其他程序直接調(diào)用
類(lèi):對(duì)具有相同數(shù)據(jù)或者方法的一組對(duì)象的集合
對(duì)象:對(duì)象是一個(gè)類(lèi)的具體事例
實(shí)例化:是一個(gè)對(duì)象事例話的實(shí)現(xiàn)
標(biāo)識(shí):每個(gè)對(duì)象的事例都需要一個(gè)可以唯一標(biāo)識(shí)這個(gè)事例的標(biāo)記
python中的類(lèi)與對(duì)象
class Person(object): def __init__(self,name): #————————>初始化函數(shù) self.name = name print "------>create:",name def say_name(self): print "my name is %s" %self.name p1 = Person("gf1") # --------->類(lèi)的實(shí)例化 p2 = Person("gf2") p1.say_name() p2.say_name()
以上程序是類(lèi)的一個(gè)基本寫(xiě)法,理解如下:
person就是一個(gè)類(lèi),在這個(gè)類(lèi)中是很多的方法集合。例如類(lèi)中包含sayname等,還可以按照程序要求靈活添加各種類(lèi)的方法。
類(lèi)中self其實(shí)就是類(lèi)的對(duì)象,是一個(gè)具體的實(shí)例。多種的實(shí)例通過(guò)類(lèi)中的self表現(xiàn)出來(lái)。
程序中的p1、p2是具體的實(shí)例,實(shí)體。(學(xué)名叫:對(duì)象。)。一個(gè)對(duì)象就是一個(gè)實(shí)體。實(shí)體通過(guò)調(diào)用屬性、方法在類(lèi)中體現(xiàn)相應(yīng)的功能。
python中的繼承
承就是子類(lèi)繼承了父類(lèi)相應(yīng)的功能和方法。
如下代碼說(shuō)明了子類(lèi)繼承父類(lèi):
class firsttest: def __init__(self,name): self._name = name def sayfirst(self): print("hello {0}".format(self._name)) class secondtest(firsttest): #子類(lèi)繼承父類(lèi)(firsttest)的方法 def __init__(self,name): firsttest.__init__(self,name) def saysecond(self): print("good {0}").format(self._name) s = secondtest("gf1") #類(lèi)的具體實(shí)例。 s.sayfirst() s.saysecond()
函數(shù)和面向?qū)ο缶幊痰膮^(qū)別
相同點(diǎn):都是把程序進(jìn)行封裝、方便重復(fù)利用,提高效率。
不同點(diǎn):函數(shù)重點(diǎn)是用于整體調(diào)用,一般用于一段不可更改的程序。僅僅是解決代碼重用性的問(wèn)題。
而面向?qū)ο蟪鰜?lái)代碼重用性。還包括繼承、多態(tài)等。使用上更加靈活。
2 面向?qū)ο笾衧uper的作用?
Python中對(duì)象方法的定義很怪異,第一個(gè)參數(shù)一般都命名為self(相當(dāng)于其它語(yǔ)言的this,比如:C#),用于傳遞對(duì)象本身,而在調(diào)用的時(shí)候則不
必顯式傳遞,系統(tǒng)會(huì)自動(dòng)傳遞。
今天我們介紹的主角是super(), 在類(lèi)的繼承里面super()非常常用, 它解決了子類(lèi)調(diào)用父類(lèi)方法的一些問(wèn)題, 父類(lèi)多次被調(diào)用時(shí)只執(zhí)行一次, 優(yōu)化了執(zhí)行邏輯,下面我們就來(lái)詳細(xì)看一下。
舉一個(gè)例子:
class Foo: def bar(self, message): print(message) Foo().bar("Hello, Python.") Hello, Python
當(dāng)存在繼承關(guān)系的時(shí)候,有時(shí)候需要在子類(lèi)中調(diào)用父類(lèi)的方法,此時(shí)最簡(jiǎn)單的方法是把對(duì)象調(diào)用轉(zhuǎn)換成類(lèi)調(diào)用,需要注意的是這時(shí)self參數(shù)需要顯式傳遞,例如:
class FooParent: def bar(self, message): print(message) class FooChild(FooParent): def bar(self, message): FooParent.bar(self, message) FooChild().bar("Hello, Python.") Hello, Python.
這樣做有一些缺點(diǎn),比如說(shuō)如果修改了父類(lèi)名稱(chēng),那么在子類(lèi)中會(huì)涉及多處修改,另外,Python是允許多繼承的語(yǔ)言,如上所示的方法在多繼承時(shí)就需要重復(fù)寫(xiě)多次,顯得累贅。為了解決這些問(wèn)題,Python引入了super()機(jī)制,例子代碼如下:
class FooParent: def bar(self, message): print(message) class FooChild(FooParent): def bar(self, message): super(FooChild, self).bar(message) FooChild().bar("Hello, Python.") Hello, Python
表面上看 super(FooChild, self).bar(message)
方法和FooParent.bar(self, message)
方法的結(jié)果是一致的,實(shí)際上這兩種方法的內(nèi)部處理機(jī)制大大不同,當(dāng)涉及多繼承情況時(shí),就會(huì)表現(xiàn)出明顯的差異來(lái),直接給例子: 代碼一:
class A: def __init__(self): print("Enter A") print("Leave A") class B(A): def __init__(self): print("Enter B") A.__init__(self) print("Leave B") class C(A): def __init__(self): print("Enter C") A.__init__(self) print("Leave C") class D(A): def __init__(self): print("Enter D") A.__init__(self) print("Leave D") class E(B, C, D): def __init__(self): print("Enter E") B.__init__(self) C.__init__(self) D.__init__(self) print("Leave E") E()
結(jié)果:
Enter E Enter B Enter A Leave A Leave B Enter C Enter A Leave A Leave C Enter D Enter A Leave A Leave D Leave E
執(zhí)行順序很好理解,唯一需要注意的是公共父類(lèi)A被執(zhí)行了多次。
總結(jié)
以上所述是小編給大家介紹的python面試題小結(jié),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
如果你覺(jué)得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!
相關(guān)文章
詳解Tensorflow數(shù)據(jù)讀取有三種方式(next_batch)
本篇文章主要介紹了Tensorflow數(shù)據(jù)讀取有三種方式(next_batch),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02Python程序員鮮為人知但你應(yīng)該知道的17個(gè)問(wèn)題
這篇文章主要介紹了Python程序員代碼編寫(xiě)時(shí)應(yīng)該避免的17個(gè)“坑”,也可以說(shuō)成Python程序員代碼編寫(xiě)時(shí)應(yīng)該避免的17個(gè)問(wèn)題,需要的朋友可以參考下2014-06-06Python3爬蟲(chóng)里關(guān)于識(shí)別微博宮格驗(yàn)證碼的知識(shí)點(diǎn)詳解
在本篇文章里小編給大家分享了關(guān)于Python3爬蟲(chóng)里關(guān)于識(shí)別微博宮格驗(yàn)證碼的知識(shí)點(diǎn),有興趣的朋友們可以參考下。2020-07-07python實(shí)現(xiàn)逆序輸出一個(gè)數(shù)字的示例講解
今天小編就為大家分享一篇python實(shí)現(xiàn)逆序輸出一個(gè)數(shù)字的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06淺談Python爬蟲(chóng)原理與數(shù)據(jù)抓取
這篇文章主要介紹了淺談爬蟲(chóng)原理與數(shù)據(jù)抓取,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07python實(shí)現(xiàn)創(chuàng)建新列表和新字典,并使元素及鍵值對(duì)全部變成小寫(xiě)
今天小編就為大家分享一篇python實(shí)現(xiàn)創(chuàng)建新列表和新字典,并使元素及鍵值對(duì)全部變成小寫(xiě),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python深度學(xué)習(xí)之Unet?語(yǔ)義分割模型(Keras)
這篇文章主要介紹了語(yǔ)義分割任務(wù)中Unet一個(gè)有意思的模型-Keras。Keras是一個(gè)由Python編寫(xiě)的開(kāi)源人工神經(jīng)網(wǎng)絡(luò)庫(kù),可進(jìn)行深度學(xué)習(xí)模型的設(shè)計(jì)、調(diào)試、評(píng)估、應(yīng)用和可視化。感興趣的小伙伴快來(lái)跟隨小編一起學(xué)習(xí)一下吧2021-12-12用Python實(shí)現(xiàn)web端用戶(hù)登錄和注冊(cè)功能的教程
這篇文章主要介紹了用Python實(shí)現(xiàn)web端用戶(hù)登錄和注冊(cè)功能的教程,需要的朋友可以參考下2015-04-04