前文講過反射是以字符串的形式去對象中操作成員,根據上面的代碼看來類只能找類里的成員;而對象既可以找到自己的成員也可以找類的成員。2.成員
class Foo: #靜態字段 position='China' #構造法方法 def __init__(self,name): temp='xxx' #普通字段,存在對象中 self.name=name #靜態方法,可以通過類訪問 @staticmethod def xo(arg1):#可以沒有參數 print 'xo' print'arg' Foo.xo('123') #xo #123 #普通方法,存在類中 def show(self): print 'show' #類方法,通過類進行訪問 @classmethod def xxoo(cls):#必須要有cls print ('xxoo',cls)Foo.xxoo()#將當前類的類名傳入#('xxoo', <class __main__.foo at 0x020A9CA8>) #特性,將方法偽裝成一種字段 @property def start(self):#不能傳額外的參數 temp='%s ' %self.name return temp def end(self): temp='%s ' %self.name return temp obj=Foo('peter') return1=obj.end() print return1 return2=obj.start #未加括號 print return2#peter#peter綜上所述:類的成員中包括靜態字段,普通字段,靜態方法,普通方法,類方法,特性。 其中通過類訪問的有:靜態字段,靜態方法、類方法。 通過對象方有的有:普通字段、普通方法和特性
靜態字段:存在類中 ,靜態字段存在的意:把對象里面重復的數據只在類里保存一份。 普通字段,存放在對象中。 普通方法必須創建對象后才可以調用。 靜態方法不需要先創建對象就可以調用,它只是寫來類里的一個函數,跟對象無關,通過類直接訪問,支持函數式編程。 類方法可通過類直接訪問,帶有的必須參數是當前類的類名,無需建立對象。 特性是對象來調用的,原來以函數的訪問方式(函數后加括號)改成以字段的形式來訪問,此時該函數不能添加參數。
3.成員修飾符
全局變量(公有成員):任何對象都能訪問。 局部變量(私有成員):只有在類的內部才能訪問,定義方式為命名時,加入下劃線。
class Person: contry='China' #靜態字段,屬于全局變量 __provice='HuBei' #局部變量,屬于私有變量 def __init__(self,name): self.name=name def get_person_arg(self): print (Person.__provice)print (Person.__provice)#AttributeError: class Person has no attribute '__provice'#不能訪問私有變量p=Person('peter')print p.__provice#AttributeError: Person instance has no attribute '__provice'#類實例也不能訪問私有變量p=Person('peter')p.get_person_arg()#HuBei#通過類的方法獲取私有變量那么Person的子類能夠訪問他的私有變量嗎?
class A: def __init__(self,name): self.__name='alex' def get_arg(self): print self.__nameclass B(A): def get_arg(self): print self.__nameb=B()b.get_arg()#AttributeError: B instance has no attribute '_B__name'#創建b實例時,執行父類的構造函數,但是__name為A類的私有變量,并不能繼承,所以錯誤中提示B類并沒有__name變量。所以,私有變量(函數)只有自己能訪問,其他父類子類都不行。
4.類的特殊成員
class A: def __init__(self): print 'init' def __call__(self,*args,**kwargs): print 'call'a=A()a()#init#call類后面加括號執行__init__對象后面加括號執行__call__doc:表示類的描述信息 module:當前操作的對象在哪個模塊. class:表示當前操作對象的類是什么 init:構造方法,創建對象時自動觸發 call:對象后面加括號,觸發執行 dict:類或對象中的所有成員 str:如果一個類中定義了str方法,那么在打印對象時,默認輸出該方法的返回值。 setitem,getitem,delitem,用于索引操作,如字典。分別表示獲取,設置,刪除數據。