目錄:
一、一些相關的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課後習題及答案
**********************************