zoukankan      html  css  js  c++  java
  • 课时40:类与对象:一些相关的BIF

    目录:

       一、一些相关的BIF

       二、、课时40课后习题及答案

    ********************** 

    一、一些相关的BIF

    **********************

    1、issubclass(class,classinfo)

    如果第一个参数(class)是第二个参数(classinfo)的一个子类,则返回True,否则返回False:

    (1)一个类被认为是其自身的子类。

    (2)classinfo可以是类对象组成的元组,只要class是其中任何一个候选类的子类,则返回True。

    (3)在其它情况下,会抛出一个TypeError异常。

    >>> class A:
        pass
    
    >>> class B(A):
        pass
    
    >>> issubclass(B,A)
    True
    >>> issubclass(B,B)
    True
    >>> issubclass(B,object)#object是所有类的基类
    True
    >>> class C:
        pass
    
    >>> issubclass(B,C)
    False

    2、isinstance(object,classinfo)

     如果第一个参数(object)是第二个参数(classinfo)的实例对象,则返回True,否则,返回False:

    (1)如果object是classinfo的子类的一个实例,也符合条件。

    (2)如果第一个参数不是对象,则永远返回False。

    (3)classinfo可以是类对象组成的元组,只要object是其中任何一个候选对象的实例,则返回True。

    (4)如果第二个参数不是类或者由类对象组成的元组,会抛出一个TypeError的异常。

    >>> issubclass(B,C)
    False
    >>> b1 = B()
    >>> isinstance(b1,B)
    True
    >>> isinstance(b1,C)
    False
    >>> isinstance(b1,A)
    True
    >>> isinstance(b1,(A,B,C))

    Python提供一下几个BIF用于访问对象的属性。

    3、hasattr(object,name)

    attr即attribute的缩写,属性的意思。接下来介绍的几个BIF都是跟对象的属性有关系的,例如这个hasattr()的作用就是测试一个对象里是否指定的属性。

    第一个参数(object)是对象,第二个参数(name)是属性名(属性的字符串名字),举个例子:

    >>> class C:
        def __init__(self,x=0):
            self.x = x
    
            
    >>> c1 = C()
    >>> hasattr(c1,'x') #注意属性名要用引号括起来
    True

    4、getattr(object,name[,default])

    返回对象指定的属性值,如果指定的属性不存在,则返回default(可选参数)的值;若没有设置default参数,则抛出ArttributeError异常。

    >>> getattr(c1,'x')
    0
    >>> getattr(c1,'y')
    Traceback (most recent call last):
      File "<pyshell#29>", line 1, in <module>
        getattr(c1,'y')
    AttributeError: 'C' object has no attribute 'y'

    5、setattr(object,name,value)

    与getattr()对应,setattr()可以设置对象中指定属性的值,如果指定的属性不存在,则会新建属性并赋值。

    >>> setattr(c1,'y','FishC')
    >>> getattr(c1,'y')
    'FishC'

    6、delattr(object,name)

    与setattr()相反,delattr()用于删除对象中指定的属性,如果属性不存在,则抛出ArttributeError异常。

    >>> delattr(c1,'y')
    >>> delattr(c1,'z')
    Traceback (most recent call last):
      File "<pyshell#35>", line 1, in <module>
        delattr(c1,'z')
    AttributeError: z

    7、property(fget = None,fset = None,fdel = None,doc = None)

    俗话说:条条大路通罗马。同样是完成一件事,Python其实提供了好几种方式供你选择。property()是一个比较奇葩的BIF,它的作用是通过属性来设置属性。说起来有点绕,看一下例子:

    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.size
    18
    >>> c1.getSize()
    18
    >>> del c1.x
    >>> c1.size
    Traceback (most recent call last):
      File "<pyshell#9>", line 1, in <module>
        c1.size
    AttributeError: 'C' object has no attribute 'size'

    property()返回一个可以设置属性的属性,当然如何设置属性还是需要人为来写代码。第一个参数是获取属性的方法名(例子中是getSize),第二个参数是设置属性的方法名(例子中是setSize),第三个参数是删除属性的方法名(例子中是delSize)。

    property()有什么用呢?举个例子,在上面的例题中,为用户提供setSize方法名来设置size属性,并提供getSize方法名来获取属性。但是有一天你心血来潮,突然像对程序进行大改,就可能把setSize和getSize修改为setXSize和getXSize,那就不得不修改用户调用的接口,这样的体验很不好。

    有了property(),所有的问题都迎刃而解了,因为像上边一样,为用户访问size属性只提供了x属性。无论内部怎么改动,只需要相应的修改property()的参数,用户仍然只需要去操作x属性即可,没有任何影响。

    很神奇是吧?想知道它是如何工作的?下一章节会讲到。

    **********************************

    二、、课时40课后习题及答案

    **********************************

     

  • 相关阅读:
    制作自己的漫画书
    VOIP-- 打电话
    python批量给图片添加logo
    python图片拼接
    一种下载电影很快的方法 you-get
    运动健身
    深圳朋友来玩
    多关键字排序实验
    最小生成树实验
    MySQL命令大全(值得一看)
  • 原文地址:https://www.cnblogs.com/DC0307/p/9527216.html
Copyright © 2011-2022 走看看