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('', 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'}

Python基础:19类和实例的内建函数的更多相关文章

  1. python基础编程——类和实例

    在了解类和实例之前,需要先了解什么是面向对象,什么又是面向过程.面向过程是以过程为中心实现一步步操作(相互调用,类似流水线思想):面向对象是以事物为中心,某个事物可以拥有自己的多个行为,而另一个事物也 ...

  2. Python基础(类和实例)

    class Point(object): def __init__(self,name,score): self.__name = name self.__score = score def prin ...

  3. python基础——枚举类

    python基础——枚举类 当我们需要定义常量时,一个办法是用大写变量通过整数来定义,例如月份: JAN = 1 FEB = 2 MAR = 3 ... NOV = 11 DEC = 12 好处是简单 ...

  4. python基础——定制类

    python基础——定制类 看到类似__slots__这种形如__xxx__的变量或者函数名就要注意,这些在Python中是有特殊用途的. __slots__我们已经知道怎么用了,__len__()方 ...

  5. Python基础-类的探讨(class)

    Python基础-类的探讨(class) 我们下面的探讨基于Python3,我实际测试使用的是Python3.2,Python3与Python2在类函数的类型上做了改变 1,类定义语法  Python ...

  6. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  7. 十九. Python基础(19)--异常

    十九. Python基础(19)--异常 1 ● 捕获异常 if VS异常处理: if是预防异常出现, 异常处理是处理异常出现 异常处理一般格式: try:     <............. ...

  8. python中的类和实例

    今天花了两个多小时后搜索相关博客看了看python中有关类和实例的介绍,差不多大概明白了. python中的类和c++中的类是一样的,不同之处就是c++的类,如果含有成员变量,并且成员变量发生变化后, ...

  9. Python学习:类和实例

    Python学习:类和实例 本文作者: 玄魂工作室--热热的蚂蚁 类,在学习面向对象我们可以把类当成一种规范,这个思想就我个人的体会,感觉很重要,除了封装的功能外,类作为一种规范,我们自己可以定制的规 ...

随机推荐

  1. MAC+iTerm定制目录显示颜色和提示符

    知道该如何定制ls时各种类型文件(unix下所有的都是file..)的颜色了. 很简单,就是在.bash_profile下加了三行. export CLICOLOR=1 export LSCOLORS ...

  2. poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 75541   ...

  3. 读书笔记--Head First C#目录

    1.c#助你快速开发2.都只是代码3.对象4.类型与引用5.封装6.继承7.接口与抽象类8.枚举与集合9.读/写文件10.异常处理11.事件与委托12.复习与预习13.控件与图片14.captain ...

  4. redis缓存使用详解

    mysql数据库是存在磁盘中的,操作是对于磁盘操作,这样访问量和并发很大时,运行速率就取决于磁盘的容量,带宽的大小和读取的方式,也就是 sql 语句,次数和效率也会影响读取效率.当访问量和并发很大的时 ...

  5. 【arc072e】AtCoder Regular Contest 072 E - Alice in linear land

    题意 给定一个D,以及一个长度为N的序列a,顺序执行这些数字: 对于一个数字x,会使得D=min(D,abs(D-x)) 有Q次询问,每次询问独立,给出i,能否修改a[i],使得D最后不为0. n,q ...

  6. 2017-09-23-ArchData

    layout: post title: ArchData category: Technical tags: [分布式,区块链,AI,大数据] ArchData 技术峰会 神经网络和函数式编程 杨博: ...

  7. 集训队日常训练20180525-DIV2

    A.2295 求有多少素数对和等于n. 暴力. #include <bits/stdc++.h> using namespace std; int ss(int n) { ,a=sqrt( ...

  8. Linux系统下实现远程连接MySQL数据库的方法教程

    1.在服务器端开启远程访问首先进入mysql数据库,然后输入下面两个命令: grant all privileges on *.* to 'root'@'%' identified by 'passw ...

  9. python 下载安装及运行环境配置(windows)

    第一步:下载python安装包 下载地址:https://www.python.org/downloads/windows/ 我下载的是版本:3.6.4 安装包下载完成后,点击进行安装. 第二步:配置 ...

  10. 数据库---JDBC的解析

    一.JDBC是什么? JDBC:Java Database Connectivity(Java数据库连接池).指定了统一的访问各种关系型数据库的标准接口-----桥梁作用.  功能:[与数据库建立连接 ...