zoukankan      html  css  js  c++  java
  • Python基础:19类和实例的内建函数

            1:issubclass()

            issubclass()布尔函数,判断一个类是否是另一个类的子类或子孙类。它有如下语法:issubclass(sub,sup)

            这个函数也允许“不严格”的子类,意味着,一个类可视为其自身的子类,所以,这个函数如果当sub 就是sup,或者从sup 派生而来,则返回True。

            从Python 2.3 开始,issubclass()的第二个参数可以是可能的父类组成的元组,这时,只要第一个参数是给定元组中任何一个候选类的子类时,就会返回True。

     

            2:isinstance()

            isinstance(object,  classinfo)

            判断object是否为classinfo的实例(对象),或是其(直接、间接、virtual)子类的实例(对象)。(类<—>类型;实例<—>对象,python2.2之后,实现了类和类型的统一)。

            classinfo可以是class对象(旧式类),也可以是type对象(新式类),或者是class或type对象组成的元组(只能是元组,其他序列不可以)。否则,会引发TypeError异常。

    >>> class  C1(object):  pass
    ...
    
    >>> class  C2(object):  pass
    ...
    
    >>> c1  =  C1()
    >>> c2  =  C2()
    >>> isinstance(c1,  C1)
    True
    
    >>> isinstance(c2,  C1)
    False
    
    >>> isinstance(c1,  C2)
    False
    
    >>> isinstance(c2,  C2)
    True
    
    >>> isinstance(C2,  c2)
    Traceback (innermost last):
    File"<stdin>", line 1, in ?
    isinstance(C2, c2)
    TypeError: s econd argument must be a class

            注意:第二个参数应当是类;不然,你会得到一个TypeError。

            也可以使用isinstance()来检查一个对象obj1 是否是obj2 的类型,比如:

    >>> isinstance(4,  int)
    True
    
    >>> isinstance(4,  str)
    False
    
    >>> isinstance('4',  str)
    True

     

            3:hasattr(), getattr(), setattr(), delattr()

            *attr()系列函数可以在各种对象下工作,不限于类(class)和实例(instances)。

            当使用这些函数时,传入正在处理的对象作为第一个参数,但属性名,也就是这些函数的第二个参数,是这些属性的字符串名字。        也就是在操作obj.attr 时,就相当于调用*attr(obj, 'attr'....)系列函数。

     

            hasattr()函数是布尔型的,它的目的就是为了判断一个对象是否有一个特定的属性,一般用于访问某属性前先作一下检查。

            getattr()和setattr()函数相应地取得和赋值给对象的属性,getattr()会在试图读取一个不存在的属性时,引发AttributeError 异常,除非给出那个可选的默认参数。setattr()要么加入一个新的属性,要么取代一个已存在的属性。        

            而delattr()函数会从一个对象中删除属性。下面一些例子使用到了*attr()系列函数:

    >>> class  myClass(object):
    ...          def  __init__(self):
    ...                 self.foo  =  100
    ...
    
    >>> myInst  =  myClass()
    >>>hasattr(myInst,  'foo')
    True
    
    >>>getattr(myInst,  'foo')
    100
    
    >>>hasattr(myInst,  'bar')
    False
    
    >>>getattr(myInst,  'bar')
    Traceback (most recent calllast):
    File"<stdin>", line 1, in ?
    getattr(myInst, 'bar')
    AttributeError:myClass instance has no attribute 'bar'
    
    >>>getattr(c,  'bar',  'oops!')
    'oops!'
    
    >>>setattr(myInst,  'bar',  'my attr')
    >>>dir(myInst)
    ['__doc__','__module__', 'bar', 'foo']
    
    >>>getattr(myInst,  'bar')
    'my attr'
    
    >>> delattr(myInst,  'foo')
    >>> dir(myInst)
    ['__doc__', '__module__','bar']
    
    >>> hasattr(myInst,  'foo')
    False

     

            4:dir()

            dir([object])

            如果没有参数,返回当前局部作用域内的名字列表。如果有参数,尝试返回参数所指明对象的属性的列表。

            dir()作用在实例上时,显示该实例的属性名,还有在实例所在的类及所有它的基类中定义的属性名。

            dir()作用在类上时,则显示该类以及它的所有基类的属性名。但它不会显示定义在元类(metaclass)中的类属性。

            dir()作用在模块上时,则显示模块的属性名。

     

            注意,dir()主要是为了在交互式环境下使用方便,它尝试提供有意义的名字的集合,而不是提供严格或一致定义的名字的集合,且在不同的版本中,具体的行为也有所变化。

     

            5:super()

            这个函数的目的就是帮助找出相应的父类,然后方便调用相关的属性。一般情况下,程序员可能仅仅采用非绑定方式调用祖先类方法。使用super()可以简化搜索一个合适祖先的任务,并且在调用它时,替你传入实例或类型对象。

     

            语法如下:super(type[,obj])

            super()“返回此type 的父类”。如果希望父类被绑定,则可以传入obj 参数(obj必须是type 类型的).否则父类不会被绑定。obj 参数也可以是一个类型,但它应当是type 的一个子类。通常,当给出obj 时:

            如果 obj 是一个实例,isinstance(obj,type)就必须返回True

            如果 obj 是一个类或类型,issubclass(obj,type)就必须返回True

     

            事实上,super()是一个工厂函数,它创造了一个super object,为一个给定的类使用__mro__去查找相应的父类。

            super主要有两种用途,第一种,在单继承中,super可以用来在不具体署名的情况下引用父类,因此使得代码更加健壮。这种用途类似于其他语言中super用途。

            第二种用法用来实现“cooperative 类”。参见《Python中的super》一文。

            比如,super(MyClass,self).__init__()。如果你没有执行这样的查找,你可能不需要使用super()。

     

            6:vars()

            vars()内建函数与dir()相似,只是给定的对象参数都必须有一个__dict__属性。vars()返回一个字典,它包含了对象存储于其__dict__中的属性(键)及值。如果提供的对象没有这样一个属性,则会引发一个TypeError 异常。如果没有提供对象作为vars()的一个参数,它将显示一个包含本地名字空间的属性(键)及其值的字典,也就是,locals()。例子如下:

    class  C(object):
            pass
    
    >>> c  =  C()
    >>> c.foo  =  100
    >>> c.bar  =  'Python'
    >>> c.__dict__
    {'foo': 100, 'bar': 'Python'}
    
    >>> vars(c)
    {'foo': 100, 'bar': 'Python'}

     

     

     

  • 相关阅读:
    棋盘问题 POJ
    Fire! UVA
    走迷宫(bfs, 最短路)
    ASP-Command-SQL格式
    ASP连接数据库SQLServer
    Bootstrap学习-导航条-分页导航
    Bootstrap导航栏头部错位问题
    SQLServer判断一个IP是否在一个IP段里
    MySQL合并多行
    CSS图片居中,多余隐藏
  • 原文地址:https://www.cnblogs.com/gqtcgq/p/7247196.html
Copyright © 2011-2022 走看看