日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python staticmethod有什么意义_关于静态方法:python中的@staticmethod有什么意义?

發布時間:2024/9/27 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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有什么意义?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。