知识点:
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
5. 通过自学的使用[扩展阅读] Python 函数修饰符(装饰器)的使用,使用修饰符修改以下代码。
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