python這方面很靈活。其實(shí)java也一樣允許這樣子。你幾乎可以在任何情況下做任何事情。
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設(shè)、成都做網(wǎng)站與策劃設(shè)計(jì),雅安網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:雅安等地區(qū)。雅安做網(wǎng)站價(jià)格咨詢:18982081108
通常class Meta可以放在外面。不過(guò),這樣它就不能直接訪問(wèn)父類的一些屬性了。
所以在python里class 如果放在另一個(gè)class 里面,通常并不是為了隱藏這個(gè)class,并不是讓別人看不到它。而因?yàn)樗枰割惱锏囊恍傩?。需要共享?/p>
另外直接在類里定義的一些變量,比如queryset,也是屬于類全局級(jí)的。只要引用了這個(gè)類,即使沒(méi)有初始化,這些變量也已經(jīng)實(shí)例化。這個(gè)有些象是java里static的全局定義結(jié)果。
我們通常用這個(gè)方法來(lái)在不同的函數(shù)變量間共享 一部分?jǐn)?shù)據(jù)。同時(shí)又不需要初始化一個(gè)實(shí)例并用指針指向這一部分?jǐn)?shù)據(jù)。而是通過(guò)類名直接引用。
比如下面的一個(gè)用法
class Config:
pass
Config.user_name="xxx"
Config.password="yyyy"
這樣。只要你在當(dāng)前模塊里,通過(guò)Config就可以引用到user_name和password,而不需要global這個(gè)修飾符。
首先如果照搬格式的話,是行不通的
即便加關(guān)鍵字也是不行的, self 和 cls 在類定義的位置無(wú)從談起。而就算寫成 Outer.outer_class_num 也是不可以的,因?yàn)檫@是在類的定義中,類自己的身體還在構(gòu)造中,如何使用自己呢?
所以如果想寫內(nèi)部類的話,需要寫在方法中。
注意圖中兩個(gè)self是不一樣的,推薦可以把內(nèi)部類的self換一個(gè)名字。
也可以像這樣使用。
Inner是在 __init__ 當(dāng)中定義的,所以只存在于實(shí)例當(dāng)中。如果想像java的 public static class 那樣,需要在類當(dāng)中定義,這里就要用到 __new__
當(dāng)然直接這么寫是錯(cuò)誤的,因?yàn)轭惖?__new__ ,本質(zhì)也是在實(shí)例化的時(shí)候才會(huì)執(zhí)行。
也就是說(shuō),在未進(jìn)行過(guò)一次實(shí)例化之前, __new__ 沒(méi)有被執(zhí)行過(guò), Outer類 對(duì)象中不存在 Inner內(nèi)部類
這樣才可以正常輸出,如果想讓類天生自帶Inner內(nèi)部類,就需要用到 metaclass
學(xué)習(xí)多種語(yǔ)言,確實(shí)能相互促進(jìn)。每當(dāng)看到一個(gè)知識(shí)點(diǎn),總是會(huì)想其他語(yǔ)言會(huì)怎么解決這個(gè)問(wèn)題。
第一,談?wù)刦inal, finally, finalize的區(qū)別。
第二,Anonymous Inner Class (匿名內(nèi)部類) 是否可以extends(繼承)其它類,是否可以mplements(實(shí)現(xiàn))interface(接口)?
第三,Static Nested Class 和 Inner Class的不同,說(shuō)得越多越好(面試題有的很籠統(tǒng))。
第四,和的區(qū)別。
第五,HashMap和Hashtable的區(qū)別。 ?
第六,Collection 和 Collections的區(qū)別。 ?
第七,什么時(shí)候用assert. ?
第八,GC是什么? 為什么要有GC? ?
第九,String s = new String("xyz");創(chuàng)建了幾個(gè)String Object? ?
第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
第十一,short s1 = 1; s1 = s1 + 1;有什么錯(cuò)? short s1 = 1; s1 += 1;有什么錯(cuò)? ?
第十二,sleep() 和 wait() 有什么區(qū)別? ?
第十三,Java有沒(méi)有g(shù)oto? ?
第十四,數(shù)組有沒(méi)有l(wèi)ength()這個(gè)方法? String有沒(méi)有l(wèi)ength()這個(gè)方法? ?
第十五,Overload和Override的區(qū)別。Overloaded的方法是否可以改變返回值的類型? ?
第十六,Set里的元素是不能重復(fù)的,那么用什么方法來(lái)區(qū)分重復(fù)與否呢? 是用==還是equals()? 它們有何區(qū)別? ?
第十七,給我一個(gè)你最常見到的runtime exception. ?
第十八,error和exception有什么區(qū)別? ? ? 第十九,List, Set, Map是否繼承自Collection接口? ?
第二十,abstract class和interface有什么區(qū)別? ?
第二十一,abstract的method是否可同時(shí)是static,是否可同時(shí)是native,是否可同時(shí)是synchronized? ?
第二十二,接口是否可繼承接口? 抽象類是否可實(shí)現(xiàn)(implements)接口? 抽象類是否可繼承實(shí)體類(concrete class)? ?
第二十三,啟動(dòng)一個(gè)線程是用run()還是start()? ?
第二十四,構(gòu)造器Constructor是否可被override? ?
第二十五,是否可以繼承String類? ?
第二十六,當(dāng)一個(gè)線程進(jìn)入一個(gè)對(duì)象的一個(gè)synchronized方法后,其它線程是否可進(jìn)入此對(duì)象的其它方法? ?
第二十七,try {}里有一個(gè)return語(yǔ)句,那么緊跟在這個(gè)try后的finally {}里的code會(huì)不會(huì)被執(zhí)行,什么時(shí)候被執(zhí)行,在return前還是后? ?
第二十八,編程題: 用最有效率的方法算出2乘以8等於幾? ?
第二十九,兩個(gè)對(duì)象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對(duì)不對(duì)? ?
第三十,當(dāng)一個(gè)對(duì)象被當(dāng)作參數(shù)傳遞到一個(gè)方法后,此方法可改變這個(gè)對(duì)象的屬性,并可返回變化后的結(jié)果,那么這里到底是值傳遞還是引用傳遞? ?
第三十一,swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
第三十二,編程題: 寫一個(gè)Singleton出來(lái)。
根據(jù)具體問(wèn)題類型,進(jìn)行步驟拆解/原因原理分析/內(nèi)容拓展等。
具體步驟如下:/導(dǎo)致這種情況的原因主要是??
首先來(lái)看一個(gè)函數(shù)間的調(diào)用
類方法:
執(zhí)行結(jié)果:
metaclass能有什么用處,先來(lái)個(gè)感性的認(rèn)識(shí):
1.1 在wiki上面,metaclass是這樣定義的:In object-oriented programming,
a metaclass is a class whose instances are classes.
Just as an ordinary class defines the behavior of certain objects,
a metaclass defines the behavior of certain classes and their instances.
也就是說(shuō)metaclass的實(shí)例化結(jié)果是類,而class實(shí)例化的結(jié)果是instance。我是這么理解的:
metaclass是類似創(chuàng)建類的模板,所有的類都是通過(guò)他來(lái)create的(調(diào)用 new ),這使得你可以自由的控制
創(chuàng)建類的那個(gè)過(guò)程,實(shí)現(xiàn)你所需要的功能。
當(dāng)然你也可以用函數(shù)的方式(下文會(huì)講)
4.1 用類的形式
4.1.1 類繼承于type, 例如: class Meta(type):pass
4.1.2 將需要使用metaclass來(lái)構(gòu)建class的類的 metaclass 屬性(不需要顯示聲明,直接有的了)賦值為Meta(繼承于type的類)
4.2 用函數(shù)的形式
4.2.1 構(gòu)建一個(gè)函數(shù),例如叫metaclass_new, 需要3個(gè)參數(shù):name, bases, attrs,
name: 類的名字
bases: 基類,通常是tuple類型
attrs: dict類型,就是類的屬性或者函數(shù)
4.2.2 將需要使用metaclass來(lái)構(gòu)建class的類的 metaclass 屬性(不需要顯示聲明,直接有的了)賦值為函數(shù)metaclas_new
5.1 basic
metaclass的原理其實(shí)是這樣的:當(dāng)定義好類之后,創(chuàng)建類的時(shí)候其實(shí)是調(diào)用了type的 new 方法為這個(gè)類分配內(nèi)存空間,創(chuàng)建
好了之后再調(diào)用type的 init 方法初始化(做一些賦值等)。所以metaclass的所有magic其實(shí)就在于這個(gè) new 方法里面了。
說(shuō)說(shuō)這個(gè)方法: new (cls, name, bases, attrs)
cls: 將要?jiǎng)?chuàng)建的類,類似與self,但是self指向的是instance,而這里cls指向的是class
name: 類的名字,也就是我們通常用類名. name 獲取的。
bases: 基類
attrs: 屬性的dict。dict的內(nèi)容可以是變量(類屬性),也可以是函數(shù)(類方法)。
所以在創(chuàng)建類的過(guò)程,我們可以在這個(gè)函數(shù)里面修改name,bases,attrs的值來(lái)自由的達(dá)到我們的功能。這里常用的配合方法是
getattr和setattr(just an advice)
下面實(shí)現(xiàn)python中在一個(gè)類中調(diào)用另一個(gè)類的函數(shù)方法
或者下面來(lái)一個(gè)號(hào)理解的例子
執(zhí)行結(jié)果:
先來(lái)介紹內(nèi)部類與外部類是什么?
看源碼解析:
內(nèi)部類調(diào)用外部類的類屬性和類方法
參考文獻(xiàn)1
參考文獻(xiàn)2
參考文獻(xiàn)3
給你一份千鋒python的面試題吧
1、多線程使用Python是個(gè)好主意嗎?列出一些方法可以讓一些Python代碼以并行方式運(yùn)行。
答:Python不允許真正意義上的多線程。它有一個(gè)多線程包,但如果你想使用多線程來(lái)加速你的代碼,那么使用它通常不是一個(gè)好主意。Python有一個(gè)名為全局解釋器鎖(Global
Interpreter
Lock(GIL))的結(jié)構(gòu)。GIL確保每次只能執(zhí)行一個(gè)“線程”。一個(gè)線程獲取GIL,做一點(diǎn)工作,然后將GIL傳遞到下一個(gè)線程。這種情況發(fā)生的很快,因此對(duì)于人眼看來(lái),你的線程似乎是并行運(yùn)行的,但它們實(shí)際上只是輪流使用相同的CPU核心。所有這些GIL傳遞都增加了運(yùn)行的內(nèi)存。這意味著如果你想讓代碼運(yùn)行得更快,那么使用線程包通常不是一個(gè)好主意。
使用Python的線程包也是有原因的。如果你想同時(shí)運(yùn)行一些東西,并且效率不是一個(gè)問(wèn)題,那么它就完全沒(méi)問(wèn)題了?;蛘撸绻阏谶\(yùn)行需要等待某些事情的代碼(例如某些IO),那么它可能會(huì)很有意義。但是線程庫(kù)不會(huì)讓你使用額外的CPU核心。
多線程可以外包到操作系統(tǒng)(通過(guò)多處理),一些調(diào)用Python代碼的外部應(yīng)用程序(例如,Spark或Hadoop),或者Python代碼調(diào)用的一些代碼例如:你可以使用你的Python代碼調(diào)用一個(gè)C函數(shù)來(lái)完成昂貴的多線程事務(wù)。
2、這段代碼輸出了什么:
def f(x,l=[]):for i in range(x):l.append(i*i)print(l) f(2)f(3,[3,2,1])f(3)
答:[0, 1][3, 2, 1, 0, 1, 4][0, 1, 0, 1, 4]
3、如何在Python中管理內(nèi)存?
Python中的內(nèi)存管理由Python私有堆空間管理。所有Python對(duì)象和數(shù)據(jù)結(jié)構(gòu)都位于私有堆中。程序員無(wú)權(quán)訪問(wèn)此私有堆。Python解釋器負(fù)責(zé)處理這個(gè)問(wèn)題。Python對(duì)象的堆空間分配由Python的內(nèi)存管理器完成。核心API提供了一些程序員編寫代碼的工具Python還有一個(gè)內(nèi)置的垃圾收集器,它可以回收所有未使用的內(nèi)存,并使其可用于堆空間。
4、range&xrange有什么區(qū)別?
在大多數(shù)情況下,xrange和range在功能方面完全相同。它們都提供了一種生成整數(shù)列表的方法,唯一的區(qū)別是range返回一個(gè)Python列表對(duì)象,x range返回一個(gè)xrange對(duì)象。
這就表示xrange實(shí)際上在運(yùn)行時(shí)并不是生成靜態(tài)列表。它使用稱為yielding的特殊技術(shù)根據(jù)需要?jiǎng)?chuàng)建值。該技術(shù)與一種稱為生成器的對(duì)象一起使用。因此如果你有一個(gè)非常巨大的列表,那么就要考慮xrange。
5、Python中help()和dir()函數(shù)的用法是什么?
Help()和dir()這兩個(gè)函數(shù)都可以從Python解釋器直接訪問(wèn),并用于查看內(nèi)置函數(shù)的合并轉(zhuǎn)儲(chǔ)。
help()函數(shù):help()函數(shù)用于顯示文檔字符串,還可以查看與模塊,關(guān)鍵字,屬性等相關(guān)的使用信息。
dir()函數(shù):dir()函數(shù)用于顯示定義的符號(hào)。
6、NumPy中有哪些操作Python列表的函數(shù)?
Python的列表是高效的通用容器。它們支持(相當(dāng))有效的插入,刪除,追加和連接,Python的列表推導(dǎo)使它們易于構(gòu)造和操作。
它們有一定的局限性:它們不支持像素化加法和乘法等“向量化”操作,并且它們可以包含不同類型的對(duì)象這一事實(shí)意味著Python必須存儲(chǔ)每個(gè)元素的類型信息,并且必須執(zhí)行類型調(diào)度代碼在對(duì)每個(gè)元素進(jìn)行操作時(shí)。
NumPy不僅效率更高; 它也更方便。你可以免費(fèi)獲得大量的向量和矩陣運(yùn)算,這有時(shí)可以避免不必要的工作。它們也得到有效實(shí)施。
NumPy數(shù)組更快,你可以使用NumPy,F(xiàn)FT,卷積,快速搜索,基本統(tǒng)計(jì),線性代數(shù),直方圖等內(nèi)置。
這些內(nèi)容還是比較重要的,如果有幫到你,麻煩采納謝謝