簡體   English   中英

使用 Python 創建 class 的實例

[英]Creating instances of a class using Python

在 Python 中創建 class 的實例時, ()實際上做了什么。我可以創建類

class class_A:
    pass

但是當我嘗試調用它時

instance_of_A = class_A 
type(instance_of_A)

我得到<class 'type'>返回

但是當我使用括號時:

instance_of_A =class_A()
type(instance_of_A)

我得到<class '__main__.classA'>

我知道這是必不可少的,但我不明白為什么。

在您的第一個語句中,您只是將 class A 分配給變量“instance_of_A”。 在您的第二條語句(您使用括號的地方)中,您實際上是在創建 class A 的實例。

我認為您需要稍微了解一下 python 中的 OOP。讓我解釋一下 OOP 在 python 中的工作原理:

Class 就像一個藍圖,實例就像是那個藍圖(類)的產品 您只能使用 object 而不能使用 class(不是說 static 方法)

class Phone:
__balance = 0
__numberOfCalls = 0
def __init__(self):
    self.__balance = 1
    print("Yeah!, New Phone")

def makeCall(self):
    if self.__balance < 1:
        print('Please recharge and try again')
        return
    self.__numberOfCalls += 1
    self.__balance -= 1
    print("Making call %d" %(self.__numberOfCalls))

在上面的例子中,我們有一個簡單的例子 class 電話。

samsung = Phone()    # Yeah!, New Phone
samsung.makeCall()   # Making call 1
samsung.makeCall()   # Please recharge and try again

這里可以清楚的了解到class Phone里面的變量(__balance, __numberOfCalls)屬於創建的實例(Samsung)。 在我們的示例中,三星無法撥打第二個電話,因為它的余額為零(注意:三星的余額為零,而不是手機)。 如果您創建一部新手機(可能是 onePlus),您可以撥打另一個電話。

class 的括號是什么?

當您調用 class 時,它會返回 class 的一個新實例。但是當您只是將它分配給一個變量而不調用它時,不會創建任何實例。

apple = Phone
apple.makeCall()    # TypeError: makeCall() missing 1 required positional argument: 'self'

這引發了一個錯誤(這是預期的),因為我們沒有調用 Phone,所以它不會返回 Phone 的實例,而是我們將 Phone(class) 分配給蘋果。
如果您來自其他語言,例如 javascript,您可能會收到“找不到方法的異常”。 但在這里我們得到的是類型錯誤,缺少位置參數 'self'

Python 將它自己的實例作為它的第一個參數self (名稱 self 只是一個約定,而不是關鍵字),這就是我們在所有方法聲明中寫 self 的原因。 我們不必將實例作為參數傳遞,當您從實例調用方法時,python 會處理它。

新問題來了……

apple = Phone
apple.makeCall(samsung)

上面的代碼會工作嗎?

是的,正如我所說,當您通過實例本身調用方法時,您不必將實例作為參數傳遞。 這里的 apple 只是一個 class(不是一個實例),並且根據之前的錯誤,我們傳遞了所需的位置參數 Samsung(它是 Phone 的一個實例)。 這類似於下面的代碼。

samsung.makeCall()

暫無
暫無

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

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