python面向對象之類成員
一、概述
上篇《python面向對象OOP》介紹了python面向對象的基礎初級入門部分,提到了類的定義,使用,類的三大特性;經典類,新式類在查找時的區別等,有了前面的基礎,本文接著描述面向對象中類成員;先整體描述下,類中的成員分以下幾部分:
#類成員
#字段(屬性):
普通字段 屬於對象,保存在對象中,只能通過對象訪問
靜態字段 屬於類,保存(一份)在類中(所有對象共享的字段屬性),執行時可以是類訪問也可以是對象訪問
#方法:
普通方法 保存在類中,又叫實例方法,首先創建對象,對象間接訪問普通方法,類也可以訪問,需要傳對象 self==>對象
靜態方法 通過加@staticmethod裝飾器變為靜態方法,保存在類中;self可省,此時可以通過類直接調用,類似模塊對函數的封裝
類方法 通過加@classmethod保存在類中,由類直接調用,cls ==>當前類
#屬性(特性):
按方法定義 ,調用時像字段屬性
二、類字段屬性
class Foo: public = "isclass" #靜態字段 def __init__(self,arg): self.name = "a" ##普通字段 self.arg = arg ##普通字段 def bar(self): print(self.name,self.arg) obj = Foo("hello") obj.bar() print(obj.public) print(Foo.public)
運行結果:
a hello
isclass
isclass
說明:在類中定義的屬性(字段)我們叫靜態字段,它不屬於對象,屬於類,好處是不管創建實例化多少對象,它只在內存中保留一份;self.xxx = xxxx這種,由於 self表示對象本身,因此保存在對象中,屬於對象,叫普通字段,實例化多少對象,內存中就保留多少份。靜態字段和普通字段,實例化的對象都可以調用。靜態字段除了對象可以調用,類也可以調用。但類不能調用對象的普通字段,因為它屬於對象。
三、類中的方法
類的方法分為普通方法,類方法 ,靜態方法 三種下面我們分別來說明:
1、普通方法(實例方法)
class Foo: public = "isclass" # 靜態字段 def __init__(self,name,age): self.name = name ##普通字段 self.age = age ##普通字段 def bar(self,arg): print(self.name, self.age,arg obj = Foo() #實例化出obj對象 obj.bar(666) #通過obj對象調用bar普通方法 Foo.bar(obj,666) #通過Foo類傳入obj對象調用bar方法
運行結果:
san 18 666
san 18 666
說明:對於普通方法,保存在類中;實例對象可以直接調用(有參數就需要傳參),類可以調用方法再傳入對象,和需要的參數,效果一樣。因此對於普通方法,實例對象可以調用,類也可以調用,但前提都需要先實例化對象,要麽直接調用,要麽通過類調用把實例對象傳入。
2、靜態方法
class Foo: def __init__(self,name,age): self.name = name self.age = age def showinfo(self): print(self.name,self.age) @staticmethod #通過@staticmethod 把方法轉換成靜態方法 def stac(): #靜態方法時self不是必須的,加了self也並非指對象 print("static") @staticmethod def stac2(a1,a2): print(a1,a2) obj = Foo("san",18) #實例化出對象obj obj.showinfo() #obj對象調用showinfo普通方法 obj.stac() #obj調用類靜態方法stac obj.stac2(1,2) #obj調用需要傳參數的類靜態方法stac2 Foo.stac() #Foo類直接調用靜態方法stac Foo.stac2(1,2) #Foo類直接調用需要傳參數的類靜態方法stac2
運行結果:
說明:靜態方法通過在方法上面添加@staticmethod裝飾器,保存在類中;靜態方法不需要傳入self參數,即使傳入了self參數也並不像普通方法那樣代指對象本身。而只是一個普通的形參數。類靜態方法對象可調用,但主要是給類調用。相當於模塊對函數的封裝。
3、類方法
Foo: (,name,age): .name = name .age = age showinfo(): (.name,.age) classmd(,arg): () (,arg) obj = Foo(,) obj.showinfo() Foo.classmd() obj.classmd()
運行結果:
說明:類方法的定義通過在方法前加@classmethod,保存在類中。默認參數為cls,cls代指類本身;類可調用,對象也可調用。該傳參數時就傳。
以上為類的三種方法,他們都保存在類中,實例化的對象都可以調用。
類的普通方法即實例方法,這是類中最常見的方法;主要是實例調用,在沒有實例的情況下類是無法調用的,調用時需要傳入實例和參數(如果有參數)對象.方法([參數]) == 類.方法(實例對象,[參數])
在類中運行而不在實例中運行的方法,我們想讓方法不在實例中運行時可用類方法;主要是用於類調用,傳入的參數是類,主要用於修改和類有關的數據。在沒有實例情況下類可直接調用。實例也可以調用。
經常有一些跟類有關系的功能但在運行時又不需要實例和類參與的情況下需要用到靜態方法.有點類似於模塊對函數的封裝。
因此我們#如果對象中需要保存一些值,執行某功能時需要使用對象中的值,用普通方法#不需要任何對象中的值, 用靜態方法,需要修改類中的值時用類方法。
四、類中屬性
現在 我們都知道 類中的方法是對過 對象.方法([參數]) 調用的,但有時候為了簡潔明了,想把這種方式變為 對象.屬性形式獲取值,這裏就引用了類中的屬性@property,來看示例:
class Foo(object): def __init__(self): self.name = "a" ##普通字段 #obj.name獲取 def bar(self): #實例方法 obj.bar()調用 print("bar") @property #屬性或叫特性 用於執行obj.per獲取值 def per(self): return 1 @per.setter #設置值 obj.per = 值 def per(self,val): print(val) @per.deleter # 刪除值 def per(self): print(66666) obj = Foo() #實例化obj r = obj.per #由於per方法加了@property此時通過obj.per獲取調用 print(r) obj.per = 123 #@per.setter即把123傳入 del obj.per #@per.deleter刪除功能,這裏模擬,可以做任何想做的功能
運行結果:
另一種寫法:
class Foo: def f1(self): #等同於@property def f1 return 123 def f2(self,v): print(v) def f3(self): print("del") per = property(fget=f1,fset=f2,fdel=f3) #第一個參數默認是fget obj = Foo() #實例化obj對象 ret = obj.f1 print(ret()) obj.per = 2 #傳輸值2 print(obj.per) #調用obj.per == obj.f1() del obj.per #刪除obj.per == obj.f3()
運行結果:
總結:通過@property裝飾器可以將一個方法變為類似屬性的調用形式。讓代碼看起來更簡潔。
以上為個人總結,如有錯誤之處歡迎指正交流。
本文出自 “學無止境,學以致用” 博客,請務必保留此出處http://dyc2005.blog.51cto.com/270872/1982981
python面向對象之類成員