1. 程式人生 > >《零基礎入門學習Python》(40)類和物件::一些與類和物件相關的BIF

《零基礎入門學習Python》(40)類和物件::一些與類和物件相關的BIF

知識點:

1.issubclass(class,classinfo)#class是classinfo的子類則返回True,相反則返回False

注意:

1.這種檢查是非嚴肅性的檢查,他會把自身當成自身的子類

2.classinfo可以是類物件組成的元組,只要class與其中任何一個候選類的子類,則返回True

>>> class A:
	pass

>>> class B(A):
	pass

>>> issubclass(B,A)
True
>>> issubclass(B,B)
True
>>> issubclass(B,object)#object可以認為是包含B類的一個元組
True
>>> class C:
	pass

>>> issubclass(B,C)
False
2.isinstance(object,classinfo)#檢查一個object例項物件是否屬於classinfo類的,有返回True,沒有返回False

注意:

1.如果第一引數不是物件,則永遠返回False。

2.如果第二個引數不是類火災類物件組成的元組,會丟擲一個TypeError異常

>>> issubclass(B,C)
False
>>> b1 =B()
>>> isinstance(b1,B)
True
>>> isinstance(b1,A)
True
>>> isinstance(b1,C)
False
>>> isinstance(b1,(A,B,C))
True
3.hasattr(object,name)#attr = attribute:屬性  檢視一個object是不是name中的屬性
>>> class C:
	def __init__(self,x=0):
		self.x = x

		
>>> cl=C()
>>> hasattr(cl,'x')
True
>>> hasattr(cl,x)
Traceback (most recent call last):
  File "<pyshell#26>", line 1, in <module>
    hasattr(cl,x)
NameError: name 'x' is not defined
4.getattr(object,name[,default])#返回引數指定的屬性值,如果指定的屬性不存在則,並且你設定default引數,它會將default打印出來,否則他們報出異常
>>> getattr(cl,'x')
0
>>> getattr(cl,'x')
0
>>> getattr(cl,'y')
Traceback (most recent call last):
  File "<pyshell#30>", line 1, in <module>
    getattr(cl,'y')
AttributeError: 'C' object has no attribute 'y'
>>> getattr(cl,'y','你訪問的屬性不存在...')
'你訪問的屬性不存在...'
5.setattr(object,name,value)#給一個屬性設定一個值,如果沒有這個屬性則建立這個屬性再賦值
>>> setattr(cl,'y','FishC')
>>> getattr(cl,'y','你訪問的屬性不存在...')
'FishC'
6.delattr(object,name)#刪除對應的屬性,如果不存在則報錯
>>> delattr(cl,'y')
>>> delattr(cl,'y')
Traceback (most recent call last):
  File "<pyshell#36>", line 1, in <module>
    delattr(cl,'y')
AttributeError: y
7.property(fget=None,fset=None,fdel=None,doc=None)#屬性設定屬性
fget=獲得屬性的方法  fset = 設定屬性的方法  fdel=刪除屬性的方法  
>>> 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.getSize()
18
>>> del c1.x
>>> c1.size
Traceback (most recent call last):
  File "<pyshell#58>", line 1, in <module>
    c1.size
AttributeError: 'C' object has no attribute 'size'

測試題:

0. 如何判斷一個類是否為另一個類的子類?

答:使用 issubclass(class, classinfo) 函式,如果第一個引數(class)是第二個引數(classinfo)的一個子類,則返回 True,否則返回 False。

另外以下這些常識你應該知道:

  • 一個類被認為是其自身的子類
  • classinfo 可以是類物件組成的元祖,只要 class 與其中任何一個候選類的子類,則返回 True
  • 在其他情況下,會丟擲一個 TypeError 異常

1. 如何判斷物件 a 是否為 類 A 的例項物件?

答:使用 isinstance(object, classinfo) 函式,如果第一個引數(object)是第二個引數(classinfo)的例項物件,則返回 True,否則返回 False。

另外以下這些常識你應該知道:

  • 如果 object是 classinfo 的子類的一個例項,也符合條件
  • 如果第一個引數不是物件,則永遠返回False
  • classinfo 可以是類物件組成的元祖,只要class與其中任何一個候選類的子類,則返回 True
  • 如果第二個引數不是類或者由類物件組成的元祖,會丟擲一個 TypeError 異常

2. 如何優雅地避免訪問物件不存在的屬性(不產生異常)?

答:有兩種方法可以做到。

第一種先使用 hasattr(object, name) 函式判斷屬性是否存在,如果存在再訪問(第一個引數(object)是物件,第二個引數(name)是屬性名的字串形式);

第二種方法是直接使用 getattr(object, name[, default]) 函式並設定 default 引數(返回物件指定的屬性值,如果指定的屬性不存在,返回default(可選引數)的值)。

3. Python 的一些 BIF 很奇怪,但卻十分有用。請問 property() 函式的作用是什麼?

答:property() 函式允許程式設計人員輕鬆、有效地管理屬性訪問。

4. 請補充以下程式碼,使程式可以正常執行:

class C:
    def __init__(self, size=10):
        self.size = size

    def getXSize(self):
        return self.size

    def setXSize(self, value):
        self.size = value

    def delXSize(self):
        del self.size

        # 此處應該補充一句程式碼,程式才能正常執行

>>> c.x
10
>>> c.x = 12
>>> c.x
12

答:x = property(getXSize, setXSize, delXSize)Gc

class CodeA:
    def foo():
        print("呼叫靜態方法 foo()")

        # 將 foo() 方法設定為靜態方法
        foo = staticmethod(foo)
class CodeA:
        @staticmethod
    def foo():
        print("呼叫靜態方法 foo()")
class CodeB:
    def foo(cls):
        print("呼叫類方法 foo()")

        # 將 foo() 方法設定為類方法
        foo = classmethod(foo)
class CodeB:
        @classmethod
    def foo(cls):
        print("呼叫類方法 foo()")

6. 你真的理解了修飾符的用法嗎?那請你寫出以下程式碼沒有用上修飾符的等同形式:

@something
def f():
    print("I love FishC.com!")

答:其實 Python 的修飾符就是一種優雅的封裝,但要注意的是隻可以在模組或類定義內對函式進行修飾,不允許修飾一個類。

一個修飾符就是一個函式,它將被修飾的函式做為引數,並返回修飾後的同名函式或其它可呼叫的東西。

@something
def f():
    print("I love FishC.com!")

# 相當於

def f():
    print("I love FishC.com!")

f = something(f)

7. 通過自學 [擴充套件閱讀] property 的詳細使用方法,將第 4 題的程式碼修改為“使用屬性修飾符建立描述符”的方式實現。

答:可能你還沒聽說過描述符(這個概念在你學完接下來的幾節課自然會了解),但這一點都影響聰明的你修改這個程式。
程式碼清單:

class C:
    def __init__(self, size=10):
        self.size = size
        
    @property
    def x(self):
        return self.size

    @x.setter
    def x(self, value):
        self.size = value

    @x.deleter
    def x(self):
        del self.size