[英]Python class as object
我想知道下面的類是否在一個定義的時刻成為一個對象,或者在我實例化它的那一刻它是否成為對象?
class BlaBlaCar(object):
def __init__(self):
pass
def bla(self):
pass
blabla = BlaBlaCar()
所以,blabla是一個對象。 問題是:BlaBlaCar類是否也是一個對象,所以當我不調用它時它是一個自己的對象? 當它被定義為'class BlaBlaCar(object)'時它是否作為對象存在於內存中?
編輯:當我這樣做時,我很清楚:
print(BlaBlaCar())然后我實例化類對象。
問題是當我創建類體定義時,我是否創建了對象?
我同意@jonrsharpe的評論,我想你可以在這里找到你需要的所有信息。 Python中幾乎所有東西都是Object。 我也查了一些參考文獻。
類定義語法最簡單的類定義形式如下所示:
class ClassName:
<statement-1>
.
.
.
<statement-N>
類定義,如函數定義(def語句)必須在它們產生任何影響之前執行。 (您可以想象將類定義放在if語句的分支中,或者放在函數內部。)
實際上,類定義中的語句通常是函數定義,但其他語句是允許的,有時也很有用 - 我們稍后會再回過頭來討論它。 類中的函數定義通常具有一種特殊形式的參數列表,由方法的調用約定決定 - 再次,這將在后面解釋。
輸入類定義時,將創建一個新的命名空間,並將其用作本地范圍 - 因此,對局部變量的所有賦值都將進入此新命名空間。 特別是,函數定義在此處綁定新函數的名稱。
正常保留類定義(通過結尾)時,會創建一個類對象 。 這基本上是類定義創建的命名空間內容的包裝器; 我們將在下一節中詳細了解類對象。 恢復原始本地范圍(在輸入類定義之前生效的范圍),並且類對象在此綁定到類定義標頭中給出的類名(示例中為ClassName)。
從中你可以看出,類的純粹定義是一個對象。
在這里,我可以找到有關對象的信息:
2.4.2。 什么是對象? Python中的所有東西都是一個對象,幾乎所有東西都有屬性和方法。 所有函數都有一個內置屬性doc ,它返回函數源代碼中定義的doc字符串。 sys模塊是一個對象,其中包含一個名為path的屬性(除其他外)。 等等。
不過,這引出了一個問題。 什么是對象? 不同的編程語言以不同的方式定義“對象”。 在某些情況下,這意味着所有對象必須具有屬性和方法; 在其他情況下,這意味着所有對象都是可子類化的。 在Python中,定義更寬松; 一些對象既沒有屬性也沒有方法(第3章中有更多內容),並且並非所有對象都是可子類化的(在第5章中有更多內容)。 但是在某種意義上,一切都是一個對象,它可以被賦值給一個變量或作為一個參數傳遞給一個函數(在第4章中更多)。
這非常重要,如果你錯過了前幾次我會重復它:Python中的所有內容都是一個對象。 字符串是對象。 列表是對象。 功能是對象。 甚至模塊都是對象 。
但請注意,在以下情況下,不會使用類定義創建實例:
blabla = BlaBlaCar()
正如其他地方所指出的,Python中幾乎所有東西都是對象。 但是,我覺得你的問題
問題是當我創建類體定義時,我是否創建了對象?
尚未直接解決。
當Python執行類的定義時,是的,創建了一個對象。 但重要的是要注意到這一點
type
的實例。 BlaBlaCar
)。 首先,為了消除任何疑問,類定義確實為您提供了一個表示類本身(而不是實例)的對象:
>>> class BlaBlaCar(object):
... pass
...
>>> id(BlaBlaCar)
57088312L
所以你看到BlaBlaCar
是內存中的一個對象。
你問,“創建的類對象在哪里?”
類定義通常位於模塊中(或者在上面的示例中,在當前命名空間中,即__main__
)。 執行此模塊時,將創建模塊對象。 作為模塊執行的一部分,執行的任何類定義都將生成一個類對象,然后將其綁定到模塊命名空間中的類名。
所以從某種意義上說,你可以說類對象是“在”模塊的命名空間中。 但實際上,您可以問一個類似的問題,“ 模塊對象在哪里創建?”,此時答案就是解釋器創建對象並有一個或多個引用,就像任何其他對象一樣創造。
一個微妙之處在於垃圾收集器將收集任何沒有引用它的對象。 對於類對象,周圍的模塊在其命名空間中具有它。 對於模塊本身,始終存在來自sys.modules
類的sys.modules
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.