和类相关的BIF

  issubclass(class,classinfo),判断第一个参数是第二个参数的子类,这个判断是比较宽松的判断。因为第二个参数也可以是元组,并且只要参数1是元组内任意一个元素的子元素,就会返回True。

>>> class A:
    pass

>>> class B:
    pass

>>> class C(A):
    pass

>>> issubclass(C,A)
True
>>> issubclass(C,B)
False
#C是元组内任意一个元素的子类即返回True
>>> issubclass(C,(A,B))
True
>>> issubclass(C,(B,A))
True
C同时是C自己的子类
>>> issubclass(C,C)
True
#object是所有类的基类
>>> issubclass(A,object)
True

  isinstance(object,classinfo),判断参数1是参数2(一定要是一个类,如果不是类那么会抛出TypeError)的对象:

#实例化一个c
>>> c = C()
#判断c是C的实例化对象
>>> isinstance(c,C)
True
#判断c是B的实例化对象
>>> isinstance(c,B)
False
#由于C是A的子类,所以c也是A的对象
>>> isinstance(c,A)
True
#由于object是所有类的基类所以c也是object的实例化对象
>>> isinstance(c,object)
True
#判断c是否是元组内某个元素的实例化对象
>>> isinstance(c,(A,B))
True
# 当第二个参数不是类的时候,抛出TypeError异常
>>> isinstance(c,1)
Traceback (most recent call last):
  File "<pyshell#33>", line 1, in <module>
    isinstance(c,1)
TypeError: isinstance() arg 2 must be a type or tuple of types
>>> 

  hasattr(object,name),测试一个对象是否有指定的属性。

>>> class C(A):
    def __init__(self,x):
        self.x = x #为属性x赋初始值

        
>>> c = C(10)
#判断x是否是对象c中的属性 参数2一定要加引号
>>> hasattr(c,'x')
True
>>> hasattr(c,'a')
False
#如果参数2不带引号,则会抛出异常
>>> hasattr(c,x)
Traceback (most recent call last):
  File "<pyshell#44>", line 1, in <module>
    hasattr(c,x)
NameError: name 'x' is not defined
>>> 

       getattr(object,name[,default]),在一个对象中获取指定属性,参数1(object)是实例化对象,参数2(name)是属性名,参数3(default)是可选参数,当不设置参数3的时候如果这个时候访问的属性不存在,则会抛出异常,但是如果设置参数3,则会将参数3抛出,相对比较友好。

>>> getattr(c,'x')
10
>>> getattr(c,'xx')
Traceback (most recent call last):
  File "<pyshell#49>", line 1, in <module>
    getattr(c,'xx')
AttributeError: 'C' object has no attribute 'xx'
>>> getattr(c,'xx','您访问的属性不存在')
'您访问的属性不存在'
>>> 

  setattr(object,name,value),访问对象属性,并且给该属性赋值,如果该属性不存在,则会为该对象创建该属性,并且赋值,三个参数都不能为空

>>> setattr(c,'y','我爱中国')
>>> getattr(c,'y')
'我爱中国'
>>> setattr(c,'y')
Traceback (most recent call last):
  File "<pyshell#53>", line 1, in <module>
    setattr(c,'y')
TypeError: setattr expected 3 arguments, got 2
>>> setattr(c,'y','爱国主义者')
>>> getattr(c,'y')
'爱国主义者'
>>> 

  delattr(object,name),删除对象属性,如果属性不存在,抛出异常

>>> delattr(c,'y')
>>> delattr(c,'xx')
Traceback (most recent call last):
  File "<pyshell#59>", line 1, in <module>
    delattr(c,'xx')
AttributeError: xx
>>> 

  property(fget=None,fset=None,fdel=None,doc=None),它的作用是在一个类中设置一个属性来方便调用这个类中的其他属性。

>>> 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()
#在没有定义property以前我们访问和设置方法属性
>>> c1.setSize(10)
>>> c1.getSize()
10
#定义了property之后我们访问和设置方法属性
>>> c1.x
10
>>> c1.x = 20
>>> c1.x
20
>>> del c1.x
>>> c1.x
Traceback (most recent call last):
  File "<pyshell#85>", line 1, in <module>
    c1.x
  File "<pyshell#76>", line 5, in getSize
    return self.size
AttributeError: 'C' object has no attribute 'size'
>>> 

 

posted @ 2018-04-05 18:49  。低调ヽ继续  阅读(283)  评论(0编辑  收藏  举报