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

歡迎訪問 生活随笔!

生活随笔

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

python

python中@staticmethod_Python中的@staticmethod和@classmethod的区别

發布時間:2023/12/4 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python中@staticmethod_Python中的@staticmethod和@classmethod的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一直搞不明白,類方法和靜態方法的區別,特意研究了一下,跟大家分享一下。

為了方便大家了解兩者的差別,以下的示例代碼將有助于發現其中的差別:

class A(object):

def foo(self, x):

print "executing foo(%s, %s)" % (self, x)

@classmethod

def class_foo(cls, x):

print "executing class_foo(%s, %s)" % (cls, x)

@staticmethod

def static_foo(x):

print "executing static_foo(%s)" % x

a = A()

以下是對象實例調用方法的常用方法,對象實例a作為第一個參數隱式傳遞。

a.foo(1)

# executing foo(<__main__.a object at>,1)

使用classmethods時,對象實例的類作為第一個參數而不是隱式傳遞self。

a.class_foo(1)

# executing class_foo(,1)

您也可以class_foo使用該類進行調用。

實際上,如果您將某些東西定義為類方法,則可能是因為您打算從類而不是從類實例調用它。

A.foo(1)本來會引發TypeError,但A.class_foo(1)效果很好:

A.class_foo(1)

# executing class_foo(,1)

人們發現類方法的一種用途是創建可繼承的替代構造函數。

使用staticmethods時,self(對象實例)和 cls(類)都不會隱式傳遞為第一個參數。它們的行為類似于普通函數,只是您可以從實例或類中調用它們:

a.static_foo(1)

# executing static_foo(1)

A.static_foo('hi')

# executing static_foo(hi)

特別注意此句:

靜態方法用于對與類之間具有某種邏輯聯系的函數分組。

foo只是一個函數,但是當您調用a.foo它時,不僅獲得該函數,還會獲得該函數的“部分應用”版本,該對象實例a綁定為該函數的第一個參數。foo期望有2個參數,而a.foo只期望有1個參數。

a勢必到foo。這就是下面的術語“綁定”的含義:

print(a.foo)

# >

與a.class_foo,a不綁定class_foo,而是與類A綁定class_foo。

print(a.class_foo)

# >

在這里,使用靜態方法,即使它是一種方法,也a.static_foo只是返回一個沒有綁定參數的良好的'ole函數。static_foo期望有1個參數,也 a.static_foo期望有1個參數。

print(a.static_foo)

#

當然,當您static_foo使用類進行調用時,也會發生同樣的事情A。

print(A.static_foo)

#

總結一下彼此的調用區別:

總結

以上是生活随笔為你收集整理的python中@staticmethod_Python中的@staticmethod和@classmethod的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

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