1. 程式人生 > >13、Python之面向對象進階篇

13、Python之面向對象進階篇

color self. __new__ cls 賦值 @class 自動調用 類方法 系統

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之面向對象進階篇