簡體   English   中英

Python類作為對象

[英]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。 我也查了一些參考文獻。

這里,在Python Docs中,它聲明:

類定義語法最簡單的類定義形式如下所示:

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執行類的定義時,是的,創建了一個對象。 但重要的是要注意到這一點

  1. 創建的對象(類本身)是type的實例。
  2. 此時沒有創建類的實例(在您的示例中為BlaBlaCar )。

首先,為了消除任何疑問,類定義確實為您提供了一個表示類本身(而不是實例)的對象:

>>> class BlaBlaCar(object):
...     pass
...
>>> id(BlaBlaCar) 
57088312L

所以你看到BlaBlaCar是內存中的一個對象。

你問,“創建的類對象在哪里?”

類定義通常位於模塊中(或者在上面的示例中,在當前命名空間中,即__main__ )。 執行此模塊時,將創建模塊對象。 作為模塊執行的一部分,執行的任何類定義都將生成一個類對象,然后將其綁定到模塊命名空間中的類名。

所以從某種意義上說,你可以說類對象是“在”模塊的命名空間中。 但實際上,您可以問一個類似的問題,“ 模塊對象在哪里創建?”,此時答案就是解釋器創建對象並有一個或多個引用,就像任何其他對象一樣創造。

一個微妙之處在於垃圾收集器將收集任何沒有引用它的對象。 對於類對象,周圍的模塊在其命名空間中具有它。 對於模塊本身,始終存在來自sys.modules類的sys.modules

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM