# self小記

伊念發表於2019-03-31

self是例項,類中定義函式必須加self

和普通函式相比,在類中定義函式只有一點不同,即類中定義的函式的第一引數永遠是self,表示建立的類例項本身,因此,在該函式內部,就可以把各種屬性繫結到self,因為self就指向建立的例項本身。在建立例項的時候,就不能傳入空的引數了,必須傳入與方法匹配的引數,但self不需要傳,Python直譯器會自己把例項變數傳進去:
class Student(object):
    def __init__(self, name, score):
        self.name = name
        #self.name就是Student類的屬性變數(由建構函式建立的),是Student類所有。
        #而name是外部傳來的引數,不是Student類所自帶的
        #把外部傳來的引數name的值賦值給Student類自己的屬性變數self.name
        self.score = score
    def print_score(self):
        print (self.name+self.score)
    def ppr():#定義和呼叫時均不傳類例項也可以
        print('__class__')
student = Student("tian", 99)
student.name
student.print_score
#Python解釋成Student.print_score(student),所以self一定要寫
複製程式碼

封裝小記

從外部看Student類,建立例項需要給出name和score。而如何列印,都是在Student類的內部定義的,這些資料和邏輯被封裝起來了,呼叫很容易,但卻不知道內部實現的細節。
在Python中,例項的變數名如果以開頭,就變成了一個私有變數(private),只有內部可以訪問,外部不能訪問
class Student(object):

    def __init__(self, name, score):
        self.__name = name
        self.__score = score
    def print_score(self):
        print (self.__name+self.__score)
student = Student('tian', 99)
student.__name
複製程式碼
這樣通過訪問限制的保護,程式碼更加健壯。如果外部程式碼要獲取或修改name和score,可以給Student類增加get_name和get_score這樣的方法:
class Student(object):
    def get_name(self):
        return self.__name
    def get_score(self):
        return self.__score
    def set_score(self, score):
        self.__score = score
複製程式碼
#封裝的另一個好處是可以隨時給Student類增加新的方法,比如:
get_grade:class Student(object):
。。。。。。。。。。。。。。。
    def get_grade(self):
        if self.score >= 90:
            return 'A'
        elif self.score >= 60:
            return 'B'
        else:
            return 'C'
複製程式碼
變數名類似__xxx__的,也就是以雙下劃線開頭,並且以雙下劃線結尾的,是特殊變數,特殊變數是可以直接訪問的,不是private變數,所以,不能用__name__、__score__這樣的變數名。有些時候,你會看到以一個下劃線開頭的例項變數名,比如_name,這樣的例項變數外部是可以訪問的,但是,按照約定俗成的規定,當你看到這樣的變數時,意思就是,“雖然我可以被訪問,但是,請把我視為私有變數,不要隨意訪問”。

相關文章