1. 程式人生 > >python 學習彙總64:類屬性方法(初級學習- tcy)

python 學習彙總64:類屬性方法(初級學習- tcy)

類屬性方法 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'])
=======================================================================