[課后作業] 第040講:類和對象:一些相關的BIF | 課后測試題的答案


測試題答案:2-%DX61F<(

本帖隱藏的內容

^.`gI9 e_F
0. 如何判斷一個類是否為另一個類的子類? #fSyG:t
ea0B=W
答:使用 issubclass(class, classinfo) 函數,如果第一個參數(class)是第二個參數(classinfo)的一個子類,則返回 True,否則返回 False。 js5.k
y2Powered by bbs.fishc.com,<
另外以下這些常識你應該知道: 3L4 k[
Y&q^$x}+
  • 一個類被認為是其自身的子類
  • classinfo 可以是類對象組成的元祖,只要 class 與其中任何一個候選類的子類,則返回 True
  • 在其他情況下,會拋出一個 TypeError 異常

y})w a
1. 如何判斷對象 a 是否為 類 A 的實例對象? [|*D版權屬於:bbs.fishc.comxX{
O=(ZIP
答:使用 isinstance(object, classinfo) 函數,如果第一個參數(object)是第二個參數(classinfo)的實例對象,則返回 True,否則返回 False。 aYX來自:bbs.fishc.com!y_I
QYfE";Md<w
另外以下這些常識你應該知道: cGs1 *
Y來自:bbs.fishc.com~yPX&,
  • 如果 objec t是 classinfo 的子類的一個實例,也符合條件
  • 如果第一個參數不是對象,則永遠返回False
  • classinfo 可以是類對象組成的元祖,只要class與其中任何一個候選類的子類,則返回 True
  • 如果第二個參數不是類或者由類對象組成的元祖,會拋出一個 TypeError 異常

.MNu,{`
2. 如何優雅地避免訪問對象不存在的屬性(不產生異常)? #u"x+k
GTB?#b!eZ
答:有兩種方法可以做到。 qfy;e4a
r!H xG版權屬於:bbs.fishc.com7
第一種先使用 hasattr(object, name) 函數判斷屬性是否存在,如果存在再訪問(第一個參數(object)是對象,第二個參數(name)是屬性名的字符串形式); Q]SyuD
}45!olQPowered by bbs.fishc.com
第二種方法是直接使用 getattr(object, name[, default]) 函數並設置 default 參數(返回對象指定的屬性值,如果指定的屬性不存在,返回default(可選參數)的值)。 y6p^.cEe@
kgPHZ[%_c>
u9nwlM7}
3. Python 的一些 BIF 很奇怪,但卻十分有用。請問 property() 函數的作用是什么? L>[YGS06m+
QPowered by bbs.fishc.com$>uh%&nj
答:property() 函數允許編程人員輕松、有效地管理屬性訪問。 scB?J
Moj K%
lRe$nU
4. 請補充以下代碼,使程序可以正常運行: Ai,xy
MEGw OaVh)
  1. class C:
  2.     def __init__(self, size=10):
  3.         self.size = size

  4.     def getXSize(self):
  5.         return self.size

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

  8.     def delXSize(self):
  9.         del self.size

  10.         # 此處應該補充一句代碼,程序才能正常運行

  11. >>> c.x
  12. 10
  13. >>> c.x = 12
  14. >>> c.x
  15. 12
復制代碼

答:x = property(getXSize, setXSize, delXSize) Gc5^!
@])63|
]{7<oNQi
5. 通過自學【擴展閱讀】Python 函數修飾符(裝飾器)的使用,使用修飾符修改以下代碼。 djK(.{0+&T
b;5+(Bmwl
代碼A: (TKQg_:OJ,
  1. class CodeA:
  2.     def foo():
  3.         print("調用靜態方法 foo()")

  4.         # 將 foo() 方法設置為靜態方法
  5.         foo = staticmethod(foo)
復制代碼

代碼B: P%34d?|Bc
  1. class CodeB:
  2.     def foo(cls):
  3.         print("調用類方法 foo()")

  4.         # 將 foo() 方法設置為類方法
  5.         foo = classmethod(foo)
復制代碼

答:其實正是因為設置靜態方法和類方法過於討人吐槽,因此 Python 的作者才開發出了函數修飾符的形式替代。 QV%-UCA
dG,Powered by bbs.fishc.com^Hb
代碼A: di7y["m
  1. class CodeA:
  2.         @staticmethod
  3.     def foo():
  4.         print("調用靜態方法 foo()")
復制代碼

代碼B: - SI?C&].r
  1. class CodeB:
  2.         @classmethod
  3.     def foo(cls):
  4.         print("調用類方法 foo()")
復制代碼

a1N@!9]V[.
6. 你真的理解了修飾符的用法嗎?那請你寫出以下代碼沒有用上修飾符的等同形式: [dm,PQH5&
  1. @something
  2. def f():
  3.     print("I love FishC.com!")
復制代碼

答:其實 Python 的修飾符就是一種優雅的封裝,但要注意的是只可以在模塊或類定義內對函數進行修飾,不允許修飾一個類。 $Q=BY)+ U
rB+M}^
一個修飾符就是一個函數,它將被修飾的函數做為參數,並返回修飾后的同名函數或其它可調用的東西。 Z*taO=;,]H
(O.sn Ry`
  1. @something
  2. def f():
  3.     print("I love FishC.com!")

  4. # 相當於

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

  7. f = something(f)
復制代碼

*0i`,EGy版權屬於:bbs.fishc.com
7. 通過自學【擴展閱讀】property 的詳細使用方法,將第 4 題的代碼修改為“使用屬性修飾符創建描述符”的方式實現。 Jy?r-_Powered by bbs.fishc.comH
[H;來自:bbs.fishc.com4 j=3
答:可能你還沒聽說過描述符(這個概念在你學完接下來的幾節課自然會了解),但這一點都影響聰明的你修改這個程序。 8w#H1vl@
5H|Iq2i_+
代碼清單: -XFn1
k@ |]%
  1. class C:
  2.     def __init__(self, size=10):
  3.         self.size = size
  4.         
  5.     @property
  6.     def x(self):
  7.         return self.size

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

  11.     @x.deleter
  12.     def x(self):
  13.         del self.size
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM