本文內容純屬自己理解,如有錯誤歡迎指正!
一、特殊類屬性
instance.__class__
顯示類的鏈結
instance.__class__.__name__
顯示類的名稱
object.__dict__
提供物件的屬性字典,是乙個鍵值對
還有個比較重要的內建函式:
getattr(obect,key)獲取』object物件』的』key』屬性
>>> from person import person
>>> bob = person('bob smith')
>>> bob.__class__
'person.person'>
>>> bob.__class__.__name__
'person'
>>> for
keyin bob.__dict__:
print(key,'====',bob.__dict__[key])
name ==== bob smith
job ==== none
pay ==== 0
>>> for
keyin bob.__dict__:
print(key,'====',getattr(bob,key))
name ==== bob smith
job ==== none
pay ==== 0
>>>
二、通用顯示工具的實現
儲存為classtools的模組:
class
attrdisplay:
defgatherattrs
(self):
attrs =
for key in sorted(self.__dict__):
return
','.join(attrs)
#以上內容獲取了最底層類的屬性,感覺應該是這個類的鍵和值
def__str__
(self):
return
'[%s:%s]' % (self.__class__.__name__,self.gatherattrs())#自動獲取類的名稱和該類的屬性。
#就這麼簡單,根據不同的例項自動獲取類名和屬性。
#下邊是測試**,可以忽略了
if __name__ == '__main__':
class
toptest
(attrdisplay):
count = 0
def__init__
(self):
self.attr1 = toptest.count
self.attr2 = toptest.count+1
toptest.count += 2
class
subtest
(toptest):
pass
x,y = toptest(),subtest()
print(x)
print(y)
儲存為person的類,這是乙個類的最終形式
from classtools import attrdisplay #匯入模組中attrdisplay類
class
person
(attrdisplay):
#繼承attrdisplay類
def__init__
(self,name,job=none,pay=0):
self.name = name
self.job = job
self.pay = pay
deflastname
(self):
return self.name.split()[-1]
defgiveraise
(self,percent):
self.pay = int(self.pay*(1+percent))
class
manager
(person):
def__init__
(self,name,pay):
#初始化manager類
person.__init__(self,name,'mgr',pay)#通過繼承person類,目的是自動提供job = 'mgr'
C 根據類名建立類的例項物件
因為我使用這個方法的類都是和abstractscenepagedto處於乙個命名空間以及程式集下的,所以獲取命名空間和程式集的時候,直接使用abstractscenepagedto這個類進行獲取,這樣更準確一些,也不怕專案遷移改名。1 private t createactivityscenepag...
C 利用反射根據類名建立類的例項物件
反射 其實就是利用程式集的元資料資訊。反射可以有很多方法,編寫程式時請先導入 system.reflection 命名空間。1 假設你要反射乙個 dll 中的類,並且沒有引用它 即未知的型別 assembly assembly assembly.loadfile 程式集路徑,不能是相對路徑 引導程式...
C 利用反射根據類名建立類的例項物件
1 假設你要反射乙個 dll 中的類,並且沒有引用它 即未知的型別 assembly assembly assembly.loadfile 程式集路徑,不能是相對路徑 引導程式集 exe 或 dll dynamic obj assembly.createinstance 類的完全限定名 即包括命名空...