簡體   English   中英

@classmethod 和調用 class 有什么區別?

[英]What's the difference between a @classmethod and invoking a class?

假設我有一個 class 有兩種方法,一種會被類方法修飾,另一種不會。

class MyClass():
    def __init__(self):
        self.my_string = 'Hello'
    def test1(self):
        return self.my_string 
    @classmethod
    def test2(cls):
        return cls().my_string 

這兩個調用有什么區別:

MyClass().test1()
MyClass.test2()

我檢查了它們經過的時間,發現它們相差很大,所以一定有所不同,但我不明白為什么。 有更好的方法嗎? 先感謝您。

他們非常不同。

MyClass().test1()使用實例MyClass()作為其隱式第一個參數(綁定到參數self )調用實例方法test1

MyClass.test2()使用 class MyClass作為其隱式第一個參數(綁定到參數cls )調用 class 方法test2

您沒有詢問更有趣的MyClass().test2() ,它仍然使用 class MyClass (實例的類型)作為其隱式第一個參數調用 class 方法test2

您也沒有詢問MyClass.test1() ,這會引發TypeError因為MyClass.test1解析為普通的 function,並且沒有參數會隱式綁定到所需參數self


這個特殊的 class 方法很奇怪。 class 方法應該獨立於 class 的任何特定實例,或者創建並返回一個實例。 創建一個僅用於 class 方法的實例並沒有多大意義。

暫無
暫無

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

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