方法
普通方法、靜態(tài)方法和類方法,三種方法在內(nèi)存中都歸屬于類,區(qū)別在于調(diào)用方式不同。
- 普通方法:由對象調(diào)用;至少一個self參數(shù);執(zhí)行普通方法時,自動將調(diào)用該方法的對象賦值給self;
- 類方法:由類調(diào)用; 至少一個cls參數(shù);執(zhí)行類方法時,自動將該類賦給cls;
- 靜態(tài)方法:由類調(diào)用;無默認參數(shù);
class Foo(object):
def __init__(self,name):
self.name = name
def ord_func(self):
print("普通方法")
@classmethod
def class_func(cls):
"""定義類方法,至少一個cls參數(shù)"""
print("類方法")
@staticmethod
def static_func():
"""定義靜態(tài)方法,無默認參數(shù)"""
print("靜態(tài)方法")
#調(diào)用普通方法
f = Foo('wupeiqi')
f.ord_func()
#調(diào)用類方法(類方法只能通過cls訪問類屬性)
Foo.class_func()
#調(diào)用靜態(tài)方法(一個通過類調(diào)用的普通函數(shù),不能直接訪問類的任何屬性或方法)
Foo.static_func()
相同點:對于所有的方法而言,均屬于類(非對象)中,所以,在內(nèi)存中也只保存一份。
不同點:方法調(diào)用者不同、調(diào)用方法時自動傳入的參數(shù)不同。
屬性方法
@property裝飾器可以使被裝飾的方法成為一個屬性,類似其他語言的get方法
class Student(object):
def __init__(self, name, score):
self.name = name
self.__score = score
@property #實例.score 調(diào)用
def score(self):
return self.__score
@score.setter #實例.score = value 調(diào)用
def score(self,score):
if score < 0 or score > 100:
raise ValueError('invalid score')
self.__score = score
@score.deleter #del 實例.score 調(diào)用
def score(self):
del self.__score
print("score is deleted")
s = Student('Bob',59)
s.score = 60 #將60 賦給score 1
print(s.score)
# s.score = 1000 #將會觸發(fā)異常 2
del s.score
60
score is deleted
從上面可以看出,通過@property裝飾的屬性方法能夠?qū)傩苑庋b更多想要的操作