面向對象之成員
- 2019 年 10 月 20 日
- 筆記
一、總概
二、面向對象中類的成員組成
1、欄位
包含靜態欄位(每個對象都有一份)和普通欄位(每個對象都不同的數據)
class Person(): company='neusoft'#靜態欄位 def __init__(self,name,age,gender): self.N=name #普通欄位 self.A=age self.G=gender #執行靜態欄位 print(Person.company)#靜態欄位由類調用 #訪問普通欄位 r=Person('tina',18,'female') print(r.A)#普通欄位由對象來調用
2、方法
包括靜態方法(@staticmethod,無需使用對象封裝的內容)、類方法(classmethod)、普通方法(使用對象中的數據)
class Person(): def __init__(self,name,age): self.name=name self.age=age def f1(self):#普通方法 print(1111) @classmethod#類方法 def f2(cls): print(2222) @staticmethod#靜態方法 def f3():#靜態方法沒有默認參數(可以加任何參數) print(2222) #執行普通方法: ret=Person('tina',18) ret.f1() #調用類方法: Person.f2() #調用靜態方法: Person.f3()

普通方法:由對象調用;至少一個self參數;執行普通方法時,自動將調用該方法的對象賦值給self; 比如:調用obj1.modify() 在調用的時候就相當於把對象賦值給方法:Dbcontrl.modify(obj1) 他的觸發者是對象! 類方法:由類調用; 至少一個cls參數;執行類方法時,自動將調用該方法的類複製給cls; 類方法的觸發者是類,當類在觸發的時候,把自己當作參數傳給cls = class 類方法很少用! 靜態方法:由類調用;無默認參數; 其實你在類中使用靜態方法:類+靜態方法其實就等於一個函數! 觸發者是類,常用於一個工具類,在調用的時候不需要實例化!舉例來說有個工具類,如果是普通方法每次調用的都需要實例化,如果有非常非常多的人來調用難道每次都需要實例化嗎?浪費記憶體空間,用靜態方法那麼你在調用的時候就不需要實例化他了!
針對三種方法的總結概括
3、特性
又稱屬性或普通特性(@property 即將方法偽造成欄位)
在python中屬性的使用時非常少的,但是在其他語言中屬性用的非常多,因為在python中屬性是後來才有的,他的功能目前還不是很強大!但是他要告訴人們我也是支援屬性的,所以才有了這個屬性!
屬性是由方法變種而來,如果python中沒有屬性,方法完全可以代替其功能。
屬性存在的意義是:訪問屬性時可以製造出和訪問欄位完全相同的假象。
屬性的基本使用:
# ############### 定義 ############### class Pager: def __init__(self, current_page): # 用戶當前請求的頁碼(第一頁、第二頁...) self.current_page = current_page # 每頁默認顯示10條數據 self.per_items = 10 @property def start(self): val = (self.current_page - 1) * self.per_items return val @property def end(self): val = self.current_page * self.per_items return val # ############### 調用 ############### p = Pager(1) p.start 就是起始值,即:m p.end 就是結束值,即:n
#特性的補充內容: class Foo: def func(self): print('func') @property def pp(self): return 123 @pp.setter def pp(self,value): print(value) @pp.deleter def pp(self): print('del') obj=Foo() print(obj.pp) obj.pp=9999 del obj.pp #特性的另一種使用方式: class Foo(): def f1(self): return 'sdkdlalg' def f2(self,value): print(value) def f3(self): print('lsfjsljsl') ZO=property(fget=f1,fset=f2,fdel=f3,doc='此處是說明') obj=Foo() ret=obj.ZO obj.ZO=122324 del obj.ZO
二、如何快速判斷什麼時候用類執行,什麼時候用對象執行
個人總結:
遇到普通即用對象,其他就用類。(即普通方法、普通欄位、普通特性用對象來調用;類方法,靜態欄位、靜態方法則用類來調用執行)
老師總結:
有self的,對象調用;無self,類調用
三、成員修飾符
成員修飾符包括公有&私有
這裡主要強調一下
四、類的特殊成員