中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python中staticmethod與classmethod的示例分析

發布時間:2021-07-22 10:04:42 來源:億速云 閱讀:139 作者:小新 欄目:開發技術

小編給大家分享一下python中staticmethod與classmethod的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

python在類中,有三種調用method的方法:普通method,staticmethod和classmethod
前兩個應該都好理解,classmethod就是在調用這個函數的時候,會把調用對象的class object對象隱式地傳進去。咦?這個class object不是一個類型?No,在python里面,class object不像靜態語言一樣是個類型,它在虛擬機中,就是一個對象。普通method調用需要把自己self作為參數傳遞,初學的時候怎么著也不能理解,不過看多了就自然熟悉了。比較奇怪的是staticmethod和classmethod不像靜態語言一樣,通過保留關鍵字定義,而是使用@staticmethod或者staticmethod()這種builtin函數進行定義。這個@staticmethod到底是個什么東東?

@staticmethod 
def foo(x): 
 print(x)

之前用過java,所以第一反應這是個annotation……唔,確實感覺像個AOP的東西,python里把它稱作decorator。如果我們要自己實現一個staticmethod,該怎么寫呢?

研究了下官方的代碼,我再改了改,感覺應該這樣寫:

def foo(x): 
 print(x) 
class StaticMethod(object): 
 def __init__(self, function): 
  print("__init__() called") 
  self.f = function 
 def __get__(self, instance, owner): 
  print("\t__get__() called") 
  print("\tINFO: self = %s, instance =%s, owner = %s" % (self, instance, owner)) 
  return self.f 
 
class Class1(object): 
 method = StaticMethod(foo) 
  
if __name__ == '__main__': 
 ins = Class1() 
 print("ins = %s, Class1 = %s" % (ins, Class1)) 
 print("ins.method = %s, Class1.method = %s" % (ins.method, Class1.method)) 
 ins.method('abc') 
 Class1.method('xyz')

輸出結果是:

__init__() called
ins = <__main__.Class1 object at 0xece2d0>, Class1 = <class '__main__.Class1'>
__get__() called
INFO: self = <__main__.StaticMethod object at 0xece5d0>, instance =<__main__.Class1 object at 0xece2d0>, owner = <class '__main__.Class1'>
__get__() called
INFO: self = <__main__.StaticMethod object at 0xece5d0>, instance =None, owner = <class '__main__.Class1'>
ins.method = <function foo at 0xeb6c00>, Class1.method = <function foo at 0xeb6c00>
__get__() called
INFO: self = <__main__.StaticMethod object at 0xece5d0>, instance =<__main__.Class1 object at 0xece2d0>, owner = <class '__main__.Class1'>
abc
__get__() called
INFO: self = <__main__.StaticMethod object at 0xece5d0>, instance =None, owner = <class '__main__.Class1'>
xyz

嗯,看上去一切都挺順利,Class1包含了一個變量method,不過這個method其實也是一個特殊處理過的StaticMethod類。這個類中有一個__get__函數,當類被“get”的時候,被訪問的時候,會默認把訪問者的instance和class信息都傳進來。所以我們看到不管是否調用method()這個函數,只要碰著了method,這個函數就會觸發,就會打印出當前instance和class信息。雖然ins和Class1的instance各有不同,但__get__函數中只是返回foo函數,所以這里調用method之時就沒有區別,調用的都是同一個function對象。

好的,那么classmethod又如何實現呢?

def foo2(cls, x): 
 print("foo2's class = ", cls) 
 print(x) 
 
class ClassMethod(object): 
 def __init__(self, function): 
  print("ClassMethod: __init__() called") 
  self.f = function 
 def __get__(self, instance, owner = None): 
  print("\t__get__() called") 
  print("\tINFO: self = %s, instance =%s, owner = %s" % (self, instance, owner)) 
  def tmpfunc(x): 
   print("I'm tmpfunc") 
   return self.f(owner, x) 
  return tmpfunc 
 
class Class2(object): 
 method = ClassMethod(foo2) 
 
class Class21(Class2): 
 pass 
if __name__ == '__main__': 
 ins = Class2() 
 print("ins.method = %s, Class2.method = %s, Class21.method = %s" % (ins.method, Class2.method, Class21.method)) 
 ins.method('abc') 
 Class2.method('xyz') 
 Class21.method('asdf')

輸出結果是:

ClassMethod: __init__() called
__get__() called
INFO: self = <__main__.ClassMethod object at 0xdeb250>, instance =<__main__.Class2 object at 0xdeb350>, owner = <class '__main__.Class2'>
__get__() called
INFO: self = <__main__.ClassMethod object at 0xdeb250>, instance =None, owner = <class '__main__.Class2'>
__get__() called
INFO: self = <__main__.ClassMethod object at 0xdeb250>, instance =None, owner = <class '__main__.Class21'>
ins.method = <function tmpfunc at 0xdee050>, Class2.method = <function tmpfunc at 0xdee1e8>, Class21.method = <function tmpfunc at 0xdee270>
__get__() called
INFO: self = <__main__.ClassMethod object at 0xdeb250>, instance =<__main__.Class2 object at 0xdeb350>, owner = <class '__main__.Class2'>
I'm tmpfunc
foo2's class = <class '__main__.Class2'>
abc
__get__() called
INFO: self = <__main__.ClassMethod object at 0xdeb250>, instance =None, owner = <class '__main__.Class2'>
I'm tmpfunc
foo2's class = <class '__main__.Class2'>
xyz
__get__() called
INFO: self = <__main__.ClassMethod object at 0xdeb250>, instance =None, owner = <class '__main__.Class21'>
I'm tmpfunc
foo2's class = <class '__main__.Class21'>
asdf

可以看出,classmethod和staticmethod的實現方法是大同小異。staticmethod比較簡單,直接返回self.f變量就好了,而classmethod不行,需要把調用時候的class類型信息傳給foo2函數,這個函數根據接收的class信息來作不同的工作。(不過我現在也沒有想到可以用來做些什么)

有個地方值得注意,可能同志們剛才也已經想到了,我一定必須要定義一個tempfunc,再返回它才能完成工作嗎?可不可以不要

def tmpfunc(x): 
   print("I'm tmpfunc") 
   return self.f(owner, x) 
  return tmpfunc

而直接返回一個

return self.f(owner, *args)

我剛試了一把,直接傳args默認參數是不行的,因為__get__被調用的時候,還沒有把參數傳進來。只有return tmpfunc之后,Class2.method('xyz')的參數才掛在tmpfunc之上。

以上是“python中staticmethod與classmethod的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

唐山市| 沈丘县| 金堂县| 石城县| 仁布县| 曲麻莱县| 张北县| 北安市| 克什克腾旗| 福鼎市| 宁武县| 高碑店市| 汉阴县| 宜丰县| 依兰县| 汉中市| 海盐县| 彰化县| 罗源县| 西乡县| 澳门| 温宿县| 喜德县| 民乐县| 绿春县| 丁青县| 安平县| 靖江市| 梁山县| 绥宁县| 邵东县| 云浮市| 成武县| 滁州市| 泊头市| 桑日县| 博罗县| 阿拉善盟| 奉节县| 定远县| 广南县|