测试题答案:2-%DX61F<(
本帖隐藏的内容
^.`gI9 e_F0. 如何判断一个类是否为另一个类的子类?#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)
- 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)Gc5^!
@])63|
]{7<oNQi
5. 通过自学【扩展阅读】Python 函数修饰符(装饰器)的使用,使用修饰符修改以下代码。djK(.{0+&T
b;5+(Bmwl
代码A:(TKQg_:OJ,
- class CodeA:
- def foo():
- print("调用静态方法 foo()")
- # 将 foo() 方法设置为静态方法
- foo = staticmethod(foo)
代码B:P%34d?|Bc
- class CodeB:
- def foo(cls):
- print("调用类方法 foo()")
- # 将 foo() 方法设置为类方法
- foo = classmethod(foo)
答:其实正是因为设置静态方法和类方法过于讨人吐槽,因此 Python 的作者才开发出了函数修饰符的形式替代。QV%-UCA
dG,Powered by bbs.fishc.com^Hb
代码A:di7y["m
- class CodeA:
- @staticmethod
- def foo():
- print("调用静态方法 foo()")
代码B:- SI?C&].r
- class CodeB:
- @classmethod
- def foo(cls):
- print("调用类方法 foo()")
a1N@!9]V[.
6. 你真的理解了修饰符的用法吗?那请你写出以下代码没有用上修饰符的等同形式:[dm,PQH5&
- @something
- def f():
- print("I love FishC.com!")
答:其实 Python 的修饰符就是一种优雅的封装,但要注意的是只可以在模块或类定义内对函数进行修饰,不允许修饰一个类。$Q=BY)+ U
rB+M}^
一个修饰符就是一个函数,它将被修饰的函数做为参数,并返回修饰后的同名函数或其它可调用的东西。Z*taO=;,]H
(O.sn Ry`
- @something
- def f():
- print("I love FishC.com!")
- # 相当于
- def f():
- print("I love FishC.com!")
- 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@ |]%
- 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