python staticmethod有什么意义_关于静态方法:python中的@staticmethod有什么意义?
為了更好地理解靜態方法在Python中的工作方式,我開發了這個簡短的測試/示例代碼。
class TestClass:
def __init__(self, size):
self.size = size
def instance(self):
print("regular instance method - with 'self'")
@staticmethod
def static():
print("static instance method - with @staticmethod")
def static_class():
print("static class method")
a = TestClass(1000)
a.instance()
a.static()
TestClass.static_class()
此代碼工作正常,不會返回任何錯誤。我的問題是:
我是否正確地理解"self"可以理解為"這個方法將從實例中調用"?
再說一遍,@staticmethod背后的邏輯是什么-是創建可以從實例調用的靜態方法嗎?這不正是靜態方法的意義嗎?
為什么第二種方法比第三種方法更受歡迎?(我假設由于存在裝飾器,所以有一點需要說明。)第三個選項似乎更簡單、更直接。
請注意,這在2.x中根本不起作用,而a.static_class()在2.x中也不起作用。
在測試用例中添加TestClass.static()和a.static_class(),觀察會發生什么。這可能有助于說明為什么@staticmethod是有用的。
"這不正是靜態方法的意義嗎?"-能夠在實例上調用它的好處是,cls.whatever()和self.whatever()將正常工作,允許您將類名保留在類和實例方法之外,并正確處理繼承。
python中類方法差異可能重復:綁定、未綁定和靜態
這是一篇關于靜態方法的文章。綜上所述:
實例方法:需要實例作為第一個參數
類方法:要求類作為第一個參數
靜態方法:不需要作為第一個參數
關于你的問題:
對。雖然變量名self是一種約定,但它屬于實例。
靜態方法可用于將類似的實用方法分組到同一類下。
對于類中的方法,您要么需要將self添加為第一個參數,要么用@staticmethod修飾該方法。"沒有參數的非修飾方法將導致錯誤。
當用參數調用時,可以更清楚地看到這些是如何工作的。修改后的示例:
class TestClass:
weight = 200 ? ? ? ? ? ? ? ? ? ? ? ? ? ? # class attr
def __init__(self, size):
self.size = size ? ? ? ? ? ? ? ? ? ? # instance attr
def instance_mthd(self, val):
print("Instance method, with 'self':", self.size*val)
@classmethod
def class_mthd(cls, val):
print("Class method, with `cls`:", cls.weight*val)
@staticmethod
def static_mthd(val):
print("Static method, with neither args:", val)
a = TestClass(1000)
a.instance_mthd(2)
# Instance method, with 'self': 2000
TestClass.class_mthd(2)
# Class method, with `cls`: 400
a.static_mthd(2)
# Static method, with neither args: 2
總的來說,您可以從訪問的角度考慮每個方法:
如果需要訪問實例或實例組件(例如實例屬性),請使用實例方法,因為它將self作為第一個參數傳遞。
同樣,如果需要訪問類,請使用類方法。
如果對實例和類的訪問都不重要,則可以使用靜態方法。
注意,在上面的示例中,每個方法類型都傳遞相同的參數,但是通過self和cls對實例和類屬性的訪問不同。
注意,有一種方法可以使用self.__class__從實例方法訪問類組件,從而避免了對類方法的需要:
...
def instance_mthd2(self, val):
print("Instance method, with class access via `self`:", self.__class__.weight*val)
...
a.instance_mthd2(2)
# Instance method, with class access via `self`: 400
參考:我建議看RaymondHettinger的Talkpython的類開發工具包,它用示例清楚地闡明了每種方法類型的用途。
我的例子中的static_class()是您定義為類方法的嗎?
不完全是這樣。用@classmethod裝飾,將cls作為第一個參數傳遞。然后它將是一個類方法。
方法作用于調用它們的實例。實例作為第一個參數傳遞,通常稱為self。
類方法類似,但作用于整個類對象,而不是其中一個實例。它們作為構造函數和工廠函數,或者配置設置和其他同時影響類或其所有實例的情況,而不是單個實例,都非常方便。
第三個選項,靜態方法,是奇數。它們既不傳遞實例也不傳遞類。它們有利于在程序的類結構中為組織目的嵌套實用程序功能,但在某種方式上(對代碼審閱者、"linting"和程序檢查工具等)明確表示您有意不依賴實例或類值。這樣,就不會得到關于未使用的self的"已聲明但從未使用的變量"警告。
從調用者的角度來看,靜態方法與任何其他方法調用類似。如果您沒有可用的@staticmethod,那么您可以使用一個普通的實例或類方法(盡管可能存在過量"變量未使用"的風險)。!"過梁警告)。因此,與類方法不同,靜態方法是Python的一個完全可選的部分。它們不向語言添加任何功能;相反,它們提供了一種使開發人員的意圖更清晰的方法。
以下是您問題的答案:
問題1:
Do I understand correctly that"self" can be understood as something like"this method will be called from an instance"?
不,那不完全是True。self表示函數的第一個參數應該是類的實例。例如:
def my_class_function(self)
可以稱為:
self.my_class_function()
OR,
my_class_function(self)
此外,不必使用self作為對類的對象的引用。您可以使用任何東西(只要它是有效變量),但是使用self是所有地方都遵循的標準。
問題2:
Then again, what's the logic behind @staticmethod - is it to create static methods which can be called from an instance? Isn't that exactly not what static methods are about?
@staticmethod變量用于函數中不需要引用類對象的函數,即不使用self訪問類的任何屬性或函數。
問題3:
Why would the second approach be favored over the third one? (I assume that since the decorator exists, there is a point to this.) The 3rd option seems to be the simpler and more straightforward.
使用第二種方法,即使用@staticmetod,您可以使用類的對象從類外部調用函數,而不像使用第三種方法(不使用decorator),因為函數的范圍在類內。
總結
以上是生活随笔為你收集整理的python staticmethod有什么意义_关于静态方法:python中的@staticmethod有什么意义?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java web 文件上传工具类_Jav
- 下一篇: c语言在函数中只执行一次,请问大家,为什