目錄: 一、一些相關的BIF 二、、課時40課後習題及答案 ********************** 一、一些相關的BIF ********************** 1、issubclass(class,classinfo) 如果第一個參數(class)是第二個參數(classinfo)的一 ...
目錄:
一、一些相關的BIF
二、、課時40課後習題及答案
**********************
一、一些相關的BIF
**********************
1、issubclass(class,classinfo)
如果第一個參數(class)是第二個參數(classinfo)的一個子類,則返回True,否則返回False:
(1)一個類被認為是其自身的子類。
(2)classinfo可以是類對象組成的元組,只要class是其中任何一個候選類的子類,則返回True。
(3)在其它情況下,會拋出一個TypeError異常。
>>> class A: pass >>> class B(A): pass >>> issubclass(B,A) True >>> issubclass(B,B) True >>> issubclass(B,object)#object是所有類的基類 True >>> class C: pass >>> issubclass(B,C) False
2、isinstance(object,classinfo)
如果第一個參數(object)是第二個參數(classinfo)的實例對象,則返回True,否則,返回False:
(1)如果object是classinfo的子類的一個實例,也符合條件。
(2)如果第一個參數不是對象,則永遠返回False。
(3)classinfo可以是類對象組成的元組,只要object是其中任何一個候選對象的實例,則返回True。
(4)如果第二個參數不是類或者由類對象組成的元組,會拋出一個TypeError的異常。
>>> issubclass(B,C) False >>> b1 = B() >>> isinstance(b1,B) True >>> isinstance(b1,C) False >>> isinstance(b1,A) True >>> isinstance(b1,(A,B,C))
Python提供一下幾個BIF用於訪問對象的屬性。
3、hasattr(object,name)
attr即attribute的縮寫,屬性的意思。接下來介紹的幾個BIF都是跟對象的屬性有關係的,例如這個hasattr()的作用就是測試一個對象里是否指定的屬性。
第一個參數(object)是對象,第二個參數(name)是屬性名(屬性的字元串名字),舉個例子:
>>> class C: def __init__(self,x=0): self.x = x >>> c1 = C() >>> hasattr(c1,'x') #註意屬性名要用引號括起來 True
4、getattr(object,name[,default])
返回對象指定的屬性值,如果指定的屬性不存在,則返回default(可選參數)的值;若沒有設置default參數,則拋出ArttributeError異常。
>>> getattr(c1,'x') 0 >>> getattr(c1,'y') Traceback (most recent call last): File "<pyshell#29>", line 1, in <module> getattr(c1,'y') AttributeError: 'C' object has no attribute 'y'
5、setattr(object,name,value)
與getattr()對應,setattr()可以設置對象中指定屬性的值,如果指定的屬性不存在,則會新建屬性並賦值。
>>> setattr(c1,'y','FishC') >>> getattr(c1,'y') 'FishC'
6、delattr(object,name)
與setattr()相反,delattr()用於刪除對象中指定的屬性,如果屬性不存在,則拋出ArttributeError異常。
>>> delattr(c1,'y') >>> delattr(c1,'z') Traceback (most recent call last): File "<pyshell#35>", line 1, in <module> delattr(c1,'z') AttributeError: z
7、property(fget = None,fset = None,fdel = None,doc = None)
俗話說:條條大路通羅馬。同樣是完成一件事,Python其實提供了好幾種方式供你選擇。property()是一個比較奇葩的BIF,它的作用是通過屬性來設置屬性。說起來有點繞,看一下例子:
class C: def __init__(self,size = 10): self.size = size def getSize(self): return self.size def setSize(self,value): self.size = value def delSize(self): del self.size x = property(getSize,setSize,delSize)
>>> c1 = C() >>> c1.getSize() 10 >>> c1.x 10 >>> c1.x = 18 >>> c1.x 18 >>> c1.size 18 >>> c1.getSize() 18 >>> del c1.x >>> c1.size Traceback (most recent call last): File "<pyshell#9>", line 1, in <module> c1.size AttributeError: 'C' object has no attribute 'size'
property()返回一個可以設置屬性的屬性,當然如何設置屬性還是需要人為來寫代碼。第一個參數是獲取屬性的方法名(例子中是getSize),第二個參數是設置屬性的方法名(例子中是setSize),第三個參數是刪除屬性的方法名(例子中是delSize)。
property()有什麼用呢?舉個例子,在上面的例題中,為用戶提供setSize方法名來設置size屬性,並提供getSize方法名來獲取屬性。但是有一天你心血來潮,突然像對程式進行大改,就可能把setSize和getSize修改為setXSize和getXSize,那就不得不修改用戶調用的介面,這樣的體驗很不好。
有了property(),所有的問題都迎刃而解了,因為像上邊一樣,為用戶訪問size屬性只提供了x屬性。無論內部怎麼改動,只需要相應的修改property()的參數,用戶仍然只需要去操作x屬性即可,沒有任何影響。
很神奇是吧?想知道它是如何工作的?下一章節會講到。
**********************************
二、、課時40課後習題及答案
**********************************