標籤:required 直接 error span ace 關係 user foo soft
通過@staticmethod裝飾器即可把其裝飾的方法變為一個靜態方法,什麼是靜態方法呢?其實不難理解,普通的方法,可以在執行個體化後直接調用,並且在方法裡可以通過self.調用執行個體變數或類變數,但靜態方法是不可以訪問執行個體變數或類變數的,一個不能訪問執行個體變數和類變數的方法,其實相當於跟類本身已經沒什麼關係了,它與類唯一的關聯就是需要通過類名來調用這個方法
class dog(object): def __init__(self,name): self.name = name @staticmethod # 實際上跟類沒什麼關係 def eat(self,): print("%s is eating %s" % (‘ddd‘, ‘dd‘))d = dog("jianlin")d.eat()
上面的代碼執行 會出現錯誤
說是eat需要一個self參數,但調用時卻沒有傳遞,沒錯,當eat變成靜態方法後,再通過執行個體調用時就不會自動把執行個體本身當作一個參數傳給self了。
Traceback (most recent call last): File "C:/Users/Administrator.QH-20170325TNQR/PycharmProjects/SSSSS/SS/day7/靜態方法1.py", line 17, in <module> d.eat()TypeError: eat() missing 1 required positional argument: ‘self‘
變成靜態方法後,與類沒有什麼關係了,相當於一個單獨的函數 只是類下一個函數
想讓上面的代碼可以正常工作有兩種辦法
1. 調用時主動傳遞執行個體本身給eat方法,即d.eat(d)
2. 在eat方法中去掉self參數,但這也意味著,在eat中不能通過self.調用執行個體中的其它變數了
方法一
class dog(object): def __init__(self,name): self.name = name @staticmethod # 實際上跟類沒什麼關係 def eat(): print("%s is eating %s" % (‘mike‘,‘包子‘))d = dog("jianlin")d.eat()# mike is eating 包子
方法二
class dog(object): def __init__(self,name): self.name = name @staticmethod # 實際上跟類沒什麼關係 def eat(self,): print("%s is eating %s" % (self.name, ‘包子‘))d = dog("jianlin")d.eat(d)# jianlin is eating 包子
最好用類調用靜態方法 省記憶體
class Foo(object): # 最好用類調用靜態方法 省記憶體 @staticmethod def f1(args1, args2): print(args1, args2)Foo.f1(123, 345) # 類調用靜態方法 執行# 123 345
python 類進階文法 靜態方法