課時40:類與物件:一些相關的BIF

那是個好男孩發表於2018-08-24

目錄:

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

**********************************

 

 

相關文章