類中成員
1.欄位
1.靜態欄位 通過類本身訪問 靜態欄位在類代碼載入時候就已經建立,無需等到new 類名()
2.普通欄位 通過對象訪問
2.方法
所有的方法屬於類
1.普通方法 只能先建立類的對象,然後通過對象來調用
def show(self): self是自動傳遞調用方法的類對象
print(self.name)
2.靜態方法 靜態方法的調用不依賴於任何對象,通過類名.方法名()調用,節省記憶體.
靜態方法就是python的函數,參數不需要加self.任意個參數
@staticmethod
def f1():
pass
3.類方法(靜態方法的特殊形式)
@classmethod
def f1(cls): cls是自動傳遞此方法所在的類名
pass
3.屬性
包含類中的欄位和方法兩種形式
@property //屬性聲明 //方法聲明
def all_page(self): def all_page(self):
return 100 return 100
@all_page.setter all_page必須是在裝飾器@property下面定義的函數
def all_page(self,value):
pass
obj.all_page = 100 //自動調用setter裝飾器下面的方法
@all_page.deleter
def all_page(self):
pass
del obj.all_page //自動調用deleter裝飾器下面的方法
obj.all_page 屬性調用 像欄位一樣去調用直接擷取函數的傳回值
obj.all_page() 方法調用 對象調用方法的時候後面必須加上()
foo = property(fget=func1,fset=func2,fdel=func3)
foo = property(func1,func2,func3)
func1,func2,fun3都是在類中定義的方法
類名.foo 程式執行func1方法並擷取func1的傳回值
類名.foo = "newvalue" 執行func2方法
成員修飾符
預設欄位和方法name為公有的如果在欄位和方法前面加上__那麼__name這個欄位就變成私人成員了
私人成員只有類本身可以訪問,子類都不可以訪問父類的私人成員
類的特殊成員
obj=Foo() 調用Foo類中的__init__內建方法,同時建立obj對象
obj() Foo()() 調用Foo類中的__call__內建方法 此種文法只在python中存在
__str__函數:
obj = Pager() print(obj) #<__main__.Pager object at 0x00000000006E3B00>
obj = Pager() print(obj.__dict__) #{'name':'333'} 輸出的值是dict類型資料
在Pager類中定義一個 def __str__(self): return "{name:obj.name}"
print(obj) #{name:333} 輸出的是對象的字串資訊而不是對象的記憶體位址
__dict__函數:
(obj是對象)obj.__dict__ 把任意對象封裝的所有資料轉成dict
(Pager是類)Pager.__dict__ 把任意類包含的成員資訊轉成dict
__getitem__(self,item) __setitem(self,key,value) __delitem__(self,key)函數:
obj = Foo()
obj['aa'] #自動調用Foo類中的__getitem__
obj['aa']=22 #自動調用Foo類中的__setitem__
del obj['aa'] #自動調用Foo類中的__delitem__
__iter__函數
一個對象預設是不可以被迭代的,如果對象所在的類定義了__iter__函數,那麼此對象便可迭代
isinstance ret=isinstance(obj,Foo) 查看對象obj是否是Foo類或者Foo的父類的對象
issubclass ret=issubclass(Foo,Bar)
super和裝飾器的功能區別(針對代碼擴充)
1.用裝飾器可以達到在別人原先寫的函數執行流程中加上自己的代碼,但是需要在原始碼檔案的函數
上添加一個裝飾器文法糖.
2.利用super和反射機制可以在完全不修改原來代碼的情況下,添加一個子類來繼承別人原來寫的類,在
子類自訂方法中添加super(cls).func來在現有的代碼添加原來的函數.實現代碼功能擴充.
model = __import__(Path,fromlist=True) Path是讀取的配置項字串
cls = getattr(model,ClassName) ClassName是讀取的配置項的字串
obj = cls()
obj.f1()
通過字串的方式動態調用python類中的具體函數.