python 學習彙總64:類屬性方法(初級學習- tcy)
阿新 • • 發佈:2018-11-23
類屬性方法 2018/11/20 ================================================================== # 1.1.屬性 # 1)型別物件屬性 t.__doc__ 文件字串 t.__name__ 類名稱 t.__bases__ 由基類構成的元祖 t.__module__ 定義類的模組名稱 t.__dict__ 包含類方法和變數的字典 t.__abstractmethods__ 抽象方法名稱的集合 # 2)例項屬性 i.__class__ 例項所屬的類 i.__dict__ 儲存例項資料的字典 m.__func__ 實現方法的函式物件 m.__self__ 與方法相關聯的例項 ================================================================== # 1.2.方法 __len__(self) : 返回含專案的數量 __getitem__(self, key) : 返回所給鍵對應值如方法例項進行分片操作 __setitem__(self, key, value) : 儲存和key相關的value __delitem__(self, key) : 刪除鍵值對應元素(使用del語句時被呼叫) __getattribute__(self, name) : self 相關特性時使用超類getattribute方法 __getattr__(self, name) : 獲得特性 name __setattr__(self, name, value): 特性 name 賦值 __delatr__(self, name) : 刪除特性 name __metaclass__ = type ================================================================== 2.1.類函式 hasattr(object, name) #判斷物件屬性方法存在bool # print(hasattr(ab1,'x'),hasattr(a1, "printa")) #True True getattr(object, name[,default]) #獲取物件屬性或方法 # print('d=', getattr(ab1, 'x',None),';d1=',getattr(b1, 'printb',None)) #d= x ;d1= <bound method b.printb > getattr(ab1, 'printb',None)() #執行物件方法 setattr(object, name, values) #物件屬性賦值(修改或建立) # setattr(ab1, "age", "18") # print(ab1.age) ================================================================== 2.2.動態繫結屬性方法 # 1)例項繫結屬性: class Student(): pass s = Student() s.name = 'Michael' # 動態給例項繫結一個屬性 # 2)例項繫結一個方法: def set_age(self, age): # 定義一個函式作為例項方法 self.age = age from types import MethodType s.set_age = MethodType(set_age, s) # 給例項繫結一個方法 s.set_age(25) # 呼叫例項方法 s.age # 測試結果25 # 注意:給一個例項繫結的方法,對另一個例項是不起作用 # 3)所有例項都繫結方法,可以給class繫結方法: def set_score(self, score): self.score = score Student.set_score = set_score #給class繫結方法所有例項均可呼叫: s.set_score(100) s.score #100 ================================================================== 2.3 __slots__限制例項的屬性 # 1) 提高程式碼執行速度,依賴__dict__無效 # 2) 只允許對Student例項新增name和age屬性 class Student(object): __slots__ = ('name', 'age') # 用tuple定義允許繫結的屬性名稱 def __init__(self,name,age): self.name=name self.age=age s = Student() # 建立新的例項 s.name = 'Michael' # 繫結屬性'name' s.age = 25 # 繫結屬性'age' #s.score = 99 # 繫結屬性'score' 錯誤 # 注意 __slots__定義的屬性僅對當前類例項起作用,對繼承的子類是不起作用的: ================================================================== 3.1.定義類的靜態方法,類方法 class MyClass: total = 10 def __init__(self,x=20): self.x = x def show(self): print('class show():x=',self.x,self.total) self.view('show...') def view(self,name): print('name=',name) @staticmethod def s_show(): print( '靜態方法:無法訪問total和x') @classmethod def cls_show(cls): print ('類方法:(無法訪問x) total=',cls.total) a=MyClass(222) a.age=22 #呼叫obj.__setattr__(‘name’,value) #del obj.name #刪除屬性呼叫 obj.__delattr__(‘name’) #obj.name #查詢屬性呼叫obj.__getattrribute__(‘name’) a.__dict__ #{'x': 222, 'age': 22}類例項變數 a.__dict__['id']=1020120 #對例項的修改反應到區域性__dict__屬性中 a.__class__ #<class '__main__.MyClass'> MyClass.__dict__.keys() #dict_keys(['__module__', ..., 'show', 'view', 's_show', 'cls_show']) a.__dir__() #['x', 'age', '__module__', 'show', 'view', 's_show',..., 'cls_show'] =================================================================== 3.2.定義類,屬性 import math class Circle (object): def __init__ (self,radius): self. radius=radius def __getattr__ (self,name): if name=='area': return math.pi * self.radius **2 elif name== 'perimeter': return 2*math.pi*self.radius else: return object.__getattr__ (self, name) def __setattr__(self,name,value): if name in ['area', 'perimeter']: raise TypeError{"%s is readonly" % name) object.___setattr__ (self,name,value) class point: def __init__(self, x=0, y=0): #構造方法 self.x=x self.y=y def getx(self):return self.x def gety(self):return self.y def setx(self,x):self.x=x def sety(self,y):self.y=y # def getSize(self): # return self.x, self.y # def setSize(self,value): # self.x,self.y=value # # size = property(getSize, setSize) #建立屬性size def __setattr__(self, name, value): if name == "size": self.y, self.height = value else: self.__dict__[name] = value def __getattr__(self, name): if name == "size": return self.y, self.height else: raise AttributeError c=point() c.size=(2,3) print(c.x,c.y,c.size) ======================================================================
第二部分:類屬性檢視 2018/11/20 ====================================================================== 1.類屬性: getattr(Type, 'FTE'); type.__dict__['FTE'] ====================================================================== 2.1.獲取類屬性列表 # dir 返回當前範圍的所有屬性名稱列表: dir(list) # ['__add__', ......, 'sort'] # 使用 inspect 包功能來過濾: [i for i in dir(list) if inspect.isbuiltin(getattr(list, i))] #[''__new__',..., '__subclasshook__'] # inspect.isfunction獲取函式: [i for i in dir(list) if inspect.isfunction(getattr(list, i))] # ['_searchbases', ..., 'walktree'] # 使用callable-獲取可呼叫物件: [i for i in dir(inspect) if not callable(getattr(inspect, i))]# ['CO_GENERATOR', ..., 'types'] # __dict__ 獲取屬性列表: list.__dict__.keys() # dict_keys(['__repr__', ..., 'sort']) =======================================================================