物件導向2--靜態方法、類方法、屬性方法

weixin_34054866發表於2017-05-06

方法

普通方法、靜態方法和類方法,三種方法在記憶體中都歸屬於類,區別在於呼叫方式不同。

  • 普通方法:由物件呼叫;至少一個self引數;執行普通方法時,自動將呼叫該方法的物件賦值給self;
  • 類方法:由類呼叫; 至少一個cls引數;執行類方法時,自動將該類賦給cls;
  • 靜態方法:由類呼叫;無預設引數;
class Foo(object):
    def __init__(self,name):
        self.name = name

    def ord_func(self):
        print("普通方法")

    @classmethod
    def class_func(cls):
        """定義類方法,至少一個cls引數"""
        print("類方法")

    @staticmethod
    def static_func():
        """定義靜態方法,無預設引數"""
        print("靜態方法")


#呼叫普通方法
f = Foo('wupeiqi')
f.ord_func()

#呼叫類方法(類方法只能通過cls訪問類屬性)
Foo.class_func()

#呼叫靜態方法(一個通過類呼叫的普通函式,不能直接訪問類的任何屬性或方法)
Foo.static_func()
5318953-4c6b154542143072.jpg

相同點:對於所有的方法而言,均屬於類(非物件)中,所以,在記憶體中也只儲存一份。
不同點:方法呼叫者不同、呼叫方法時自動傳入的引數不同。

屬性方法

@property裝飾器可以使被裝飾的方法成為一個屬性,類似其他語言的get方法

class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.__score  = score
    @property                         #例項.score  呼叫
    def score(self):                 
        return self.__score
    @score.setter                     #例項.score = value  呼叫
    def score(self,score):
        if score < 0 or score > 100:
            raise ValueError('invalid score')
        self.__score = score
    @score.deleter                    #del 例項.score    呼叫
    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  #將會觸發異常   2
del s.score

60
score is deleted

從上面可以看出,通過@property裝飾的屬性方法能夠對屬性封裝更多想要的操作

相關文章