大鹏

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

测试题答案: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
复制代码
posted on 2018-12-11 23:09  pf42280  阅读(2107)  评论(0编辑  收藏  举报