![](/img/trans.png)
[英]What's the difference between accessing a class' attribute via the class' name vs classmethod?
[英]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.