self是例項,類中定義函式必須加self
和普通函式相比,在類中定義函式只有一點不同,即類中定義的函式的第一引數永遠是self,表示建立的類例項本身,因此,在該函式內部,就可以把各種屬性繫結到self,因為self就指向建立的例項本身。在建立例項的時候,就不能傳入空的引數了,必須傳入與方法匹配的引數,但self不需要傳,Python直譯器會自己把例項變數傳進去:
class Student(object):
def __init__(self, name, score):
self.name = 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
複製程式碼
封裝小記
從外部看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
複製程式碼
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,這樣的例項變數外部是可以訪問的,但是,按照約定俗成的規定,當你看到這樣的變數時,意思就是,“雖然我可以被訪問,但是,請把我視為私有變數,不要隨意訪問”。