13、Python之面向對象進階篇
1、靜態方法
靜態方法是指可以被類直接調用的方法,其類似於靜態屬性,其既可以被類直接調用,也可以被對象調用。在python中使用裝飾器@staticmethod來申明某個方法為靜態方法,靜態方法的實例代碼如下:
1 class Grade(object): 2 def __init__(self,name,count): 3 self.__name = name 4 self.__count = count 5 @staticmethod #申明為靜態方法 6 def print_grade( ): 7 print("這個類主要是用於創建班級對象") 8 grade = Grade("高一(2)",20)
grade.print_grade()#通過對象直接調用 9 Grade.print_grade()#可以通過類名直接調用
2、類方法
類方法也能被類和對象調用,但其只能訪問類屬性,不能訪問對象屬性,在python中使用裝飾器@classmethod來申明某個方法為類方法,類方法的實例代碼如下:
1 class Grade(object): 2 __grade_count = 1 3 def __init__(self,name,count): 4 self.__name= name 5 self.__count = count 6 @classmethod #申明為類方法 只能訪問類屬性 7 def grade_count(self): 8 print(self.__grade_count) 9 10 Grade.grade_count()#通過類調用 11 grade = Grade("高一(2)",20) 12 grade.grade_count() #通過對象調用
咋一看類方法和靜態方法貌似差不錯,其實在java或者C++等高級語言中,只有靜態方法,沒有類方法。python中新增了類方法想必有其原因,具體原因我還不知道,但是!!!我們仔細觀察會發現這兩種方法還是有一些區別的:
對於靜態方法,系統將不會自動關聯self參數,而類方法還是關聯的。至於其它的區別,我暫未想到。
3、靜態屬性
python中可以將一個方法變成一個屬性,有些時候,我們通常會將一個屬性定義為私有屬性,而後提供get和set方法用於對私有屬性的訪問和賦值操作,這樣做固然沒有問題,但使用起來不如對公有屬性那樣方便和直觀。為了讓我們對私有屬性的訪問如共有屬性一樣暢通,可使用裝飾器@property家族來完成。
現有這樣一個需求,現在有一個學生類,其年齡為私有屬性,且年齡字段必須滿足以下幾個條件:1、用戶進行修改時,必須>0,否則修改為0,2、如果年齡為0時,返回100,3,如果年齡字段>0,不可刪除,代碼實現如下:
1 class Student(object): 2 def __init__(self,name,age): 3 self.__name = name 4 self.__age = age 5 6 @property 7 def age(self): 8 pass 9 @age.setter 10 def age(self,value): #修改 11 if value > 0: 12 self.__age = value 13 else: 14 self.__age = 0 15 def print_selft(self): 16 print("姓名:%s,年齡:%s" % (self.__name,self.__age)) 17 @age.getter #訪問 18 def age(self): 19 if self.__age <= 0: 20 return 100 21 else: 22 return self.__age 23 @age.deleter #刪除 24 def age(self): 25 if self.__age > 0: 26 pass 27 else: 28 del self.__age 29 stu = Student("高文祥",18) 30 stu.age = 1 31 stu.print_selft() 32 print(stu.age) 33 del stu.age 34 print(stu.age)
裝飾器的property的功能主要有以下2點:1、將一個方法變成一個屬性 2,通過property.setter、property.getter以及property.deleter對私有屬性進行包裝。
4、特殊成員變量
1.__str__:對象訪問時,系統自動調用的方法,我們可以去重寫__str__方法。代碼如下:
1 class Student(object): 2 def __init__(self,name,age): 3 self.__name = name 4 self.__age = age 5 def __str__(self): #重寫基類方法 6 return self.__name 7 stu = Student("高文祥",20) 8 print(stu) #執行結果:高文祥
2、__setitem__,__getitem__和__delitem__:這組方法能將對對象的操作像對字典一樣操作。代碼如下:
1 class Student(object): 2 def __init__(self): 3 self.__info = {} 4 def __setitem__(self, key, value): #設置 5 self.__info[key] = value 6 def __getitem__(self, key): #賦值 7 return self.__info[key] 8 def __delitem__(self, key): #刪除 9 del self.__info[key] 10 stu = Student() 11 stu["name"] = "高文祥" 12 print(stu["name"]) 13 del stu["name"] 14 print(stu["name"])
3、__new__方法:__new__方法是在初始化之前調用的,且是在__init__方法之前調用的,而後在__new__方法中再去調用__init__方法,代碼如下:
1 class Student(object): 2 def __init__(self): 3 print("__init__") 4 def __new__(cls, *args, **kwargs): 5 print("__new__") 6 return cls.__init__(cls) 7 stu = Student() 8 #執行結果 9 # __new__ 10 #__init__
4、其他待補充
1 class Student(object): 2 "這是一個學生類" 3 def __init__(self,name,age): 4 self.name = name 5 self.age = age 6 stu = Student("高文祥",20) 7 print(stu.__doc__,stu.__dict__) #執行結果:這是一個學生類 {‘name‘: ‘高文祥‘, ‘age‘: 20}
13、Python之面向對象進階篇