Python基础(面向对象之相关)

此篇文章主要介绍以下几个知识点:

1、类、对象的从属检查

2、异常处理

3、反射

4、单例模式

类、对象的从属检查

命令格式:isinstance(obj, cls)

描述:检查obj是否是由类cls创建的对象,也可以用于判断数据类型。

例子:

n1 = 123           #定义一个 整数 类型的变量
s1 = ‘123‘          #定义一个 字符串 类型的变量
l1 = [‘123‘]         #定义一个 列表 类型的变量
d1 = {‘k1‘:‘123‘}       #定义一个 字典 类型的变量
class Cls:       #定义一个类
   pass
c1 = Cls()          #根据定义的类创建一个对象

print isinstance(n1,int)    #检查n1是否是由int类创建的对象,也就是检查n1是否是整数数据类型
print isinstance(s1,str)    #检查s1是否是由str类创建的对象,也就是检查s1是否是字符串数据类型
print isinstance(l1,list)   #检查l1是否是由list类创建的对象,也就是检查l1是否是列表数据类型
print isinstance(d1,dict)   #检查d1是否是由dict类创建的对象,也就是检查d1是否是字典数据类型
print isinstance(c1,Cls)    #检查c1是否是由Cls类创建的对象

#执行结果:
True
True
True
True
True

命令格式:issubclass(sub,super)

描述:检查sub类是否是super类(基类)的派生类

例子:

class F:         #定义一个基类
   pass

class S(F):           #定义一个类S继承基类F
   pass

print issubclass(S,F)      #判断S类是否是F类的派生类
print issubclass(F,S)      #判断F类是否是S类的派生类

#执行结果:
True
False

异常处理

所有的程序在运行的时候,都可能会出现各种各样的错误(比如:某个方法需要一个整数类型的参数,可是用户却传入了一个字符串类型的参数。),而一个优秀的程序员的基本素质就是在编写代码的时候预先判断到错误的出现,并进行相应的处理,这就需要用到异常处理。

命令格式:

try:

pass #主逻辑代码块

raise Exception(‘msg‘) #主动触发一个异常

except Exception,e: #捕获异常,变量e的值是异常描述信息

pass #捕获异常后执行的代码

else:

pass #未捕获到任何异常时执行的代码

finally:

pass #最后总会执行的代码

描述:基本的语法是在try下代码块中书写主逻辑代码,然后定义捕获的异常以及在捕获到异常后需要执行的代码,还可以定义当未捕获到任何异常时执行的代码。最后可以定义当以上代码都执行完成后需要执行的代码。

raise 用法:

命令格式:raise Exception(‘自定义的异常描述信息,也就是变量e的值‘)

自定义一个希望被捕获的异常信息,一般用于避免程序频繁的手动print错误信息。

Exception的常用类型:

AttributeError          试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x

IOError                 输入/输出异常;基本上是无法打开文件

ImportError             无法引入模块或包;基本上是路径问题或名称错误

IndentationError        语法错误(的子类) ;代码没有正确对齐

IndexError              下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]

KeyError                试图访问字典里不存在的键

KeyboardInterrupt       Ctrl+C被按下

NameError               使用一个还未被赋予对象的变量

SyntaxError             Python代码非法,代码不能编译(个人认为这是语法错误,写错了)

TypeError               传入对象类型与要求的不符合

UnboundLocalError       试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它

ValueError              传入一个调用者不期望的值,即使值的类型是正确的

捕获异常的例子:

try:
   L = [1,2,3]
   L[4]          #列表L的下标最大是2,取下标为4的值肯定会出现异常
except Exception,e:          #捕获到任何异常时执行此代码块
   print ‘Get error message: ‘,e
else:                         #未捕获到任何异常时执行此代码块
   print ‘No error‘
finally:                      #最后执行此代码块
   print ‘Process is done‘

#执行结果:
Get error message:  list index out of range
Process is done

捕获指定异常的例子:

try:
   L = [1,2,3]
   L[4]
except IndexError,e:           #只捕获类型为IndexError的异常
   print ‘Get error message: ‘,e
else:
   print ‘No error‘
finally:
   print ‘Process is done‘

#执行结果:
Get error message:  list index out of range
Process is done

未捕获异常的例子:

try:
   L = [1,2,3]
   L[1]                    #下标存在,所以不会有异常
except Exception,e:
   print ‘Get error message: ‘,e
else:
   print ‘No error‘
finally:
   print ‘Process is done‘

#执行结果:
No error
Process is done

反射

python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,这四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。

命令格式:

hasattr(容器,查找条件)  #去某个容器(模块)中,查找是否有满足条件的成员

getattr(容器,获取条件)  #去某个容器(模块)中,查找是否有满足条件的成员,有则返回该成员

setattr(容器,成员,值)  #去某个容器(模块)中,若成员存在,则修改其值,若不存在,则创建

delattr(容器,删除条件)  #去某个容器(模块)中,删除满足条件的成员。

例子:

class test:
   name = ‘123‘
   
#hasattr
print hasattr(test,‘name‘)    #执行结果为True

#getattr
ret = getattr(test,‘name‘)   #如果name是一个函数,那么ret的值就是该函数 
print ret                    #执行结果为123

#setattr
setattr(test,‘name‘,‘456‘)
print getattr(test,‘name‘)    #执行结果为456

#delattr
delattr(test,‘name‘)
print hasattr(test,‘name‘)    #执行结果为False

单例模式

一个类在内存中只创建一个对象,供所有调用者使用,避免内存浪费。

适用场景:实现单一功能的类,但同时又必须创建多个对象。

例子:

class Foo:
    __instance = None            #定义一个私有静态字段用于判断类是否被用来创建过对象
    
    @classmethod
    def instance(cls):            #定义一个类方法
        if cls.__instance:        #如果静态字段有值,则说明已创建过对象,则返回该对象
            return cls.__instance
        else:                     #如果静态字段没有值,则说明未创建过对象,那么就创建它
            cls.__instance = Foo()    #创建对象
            return cls.__instance     #创建完成后返回创建好的对象

print ‘Single test‘
obj = Foo.instance()               #使用单例模式创建对象1
print id(obj)
obj2 = Foo.instance()              #使用单例模式创建对象2
print id(obj2)
obj3 = Foo.instance()              #使用单例模式创建对象3
print id(obj3)

print ‘Normal test‘
obj4 = Foo()                       #使用正常方式创建对象4
print id(obj4)
obj5 = Foo()                       #使用正常方式创建对象5
print id(obj5)
obj6 = Foo()                       #使用正常方式创建对象6
print id(obj6)

#执行结果
Single test                     #使用单例模式创建的对象内存ID号相同,说明只创建了一个对象
39110792
39110792
39110792
Normal test                     #使用正常方式创建的对象内存ID号不同,说明创建了多个对象
39811464
39811528
39811592

文章部分内容引用自本人的Python老师武沛齐的博客,由于原博客地址不方便公开,所以在此说明。

时间: 2024-11-07 05:17:05

Python基础(面向对象之相关)的相关文章

Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础

本节内容: 1.     面向对象高级语法部分 1.1   静态方法.类方法.属性方法 1.2   类的特殊方法 1.3   反射 2.     异常处理 3.     Socket开发基础 1.     面向对象高级语法部分 1.1   静态方法.类方法.属性方法 1)   静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法.普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访

Python基础—面向对象(进阶篇)

通过上一篇博客我们已经对面向对象有所了解,下面我们先回顾一下上篇文章介绍的内容: 上篇博客地址:http://www.cnblogs.com/phennry/p/5606718.html 面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用: 类是一个模版,模板中包装了多个方法供使用(这里方法就是函数): 对象,根据模板创建的实例,实例用于调用被包装在类中的函数: 面向对象的三大特性:封装.继承.多态. 今天博客的内容主要介绍:Python类的成员.成员修饰符.类的特殊成员.异常处理和

python基础--面向对象高级、异常处理、网络编程

一.面向对象高级 1.接口与归一化设计 接口只是定义了一些方法,而没有去实现,多用于程序设计时,只是设计需要有什么样的功能,但是并没有实现任何功能,这些功能需要被另一个类(B)继承后,由 类B去实现其中的某个功能或全部功能. 在python中接口由抽象类和抽象方法去实现,接口是不能被实例化的,只能被别的类继承去实现相应的功能 归一化让使用者无需关心对象的类是什么,只需要知道这些对象都具备某些功能就可以了,这极大地降低了使用者的使用难度. 归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的

Python之路,Day8 - Python基础 面向对象高级进阶与socket基础

类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份. 一.字段 字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同, 普通字段属于对象 静态字段属于类 class Province: # 静态字段 country = '中国'def __init__(self, name): #

Python基础-面向对象进阶

面向对象进阶 一 类中的装饰器方法  classmethod staticmethod property 1.1 property 一般情况下,方法都是动词.指某一类事物的动作 在计算圆形的周长和面积的时候,他们应该是圆形的属性,但是这里确是一个方法.这不符合python面向对象(能够完全区分属性和方法)的理念. 所以我们可以用一个装饰器去将一个属性性质的函数,装饰成一个属性.可以以调用属性的方式去调用他. from math import pi class Circle: def __init

python基础-面向对象opp

上述是实例化对象的一个过程. 类的定义和实例化: class Role(object): #定义一个类, class是定义类的语法,Role是类名,(object)是新式类的写法,必须这样写,以后再讲为什么 def __init__(self,name,role,weapon,life_value=100,money=15000): #初始化函数,在生成一个角色时要初始化的一些属性就填写在这里 self.name = name #__init__中的第一个参数self,和这里的self都 是什么

Python基础面向对象的基本概念

Python使用类(class)和对象(object),进行面向对象(object-oriented programming,简称OOP)的编程. 面向对象的最主要目的是提高程序的重复使用性.我们这么早切入面向对象编程的原因是,Python的整个概念是基于对象的.了解OOP是进一步学习Python的关键. 下面是对面向对象的一种理解,基于分类. 相近对象,归为类 在人类认知中,会根据属性相近把东西归类,并且给类别命名.比如说,鸟类的共同属性是有羽毛,通过产卵生育后代.任何一只特别的鸟都在鸟类的原

python基础-面向对象

类和对象 面向过程的编程:C 面向对象的编程:C++,JAVA,Python 类:对事物的抽象,如汽车模型 对象:类的一个实例.如大客车 python类定义:使用class关键字定义一个类,并且类名首字母要大写.在类中可以定义一些变量(属性)和函数(方法) #将需要的变量和函数组合在一起,也称之为‘封装’ 创建对象:创建对象的过程称为实例化,当一个对象创建好后,包含三个方面的内容,对象的句柄,属性和方法. 句柄用于区分不同的对象 对象的属性和方法与类中的成员变量和成员函数对应 #类和列表相似,比

python基础----面向对象的程序设计

面向对象的软件开发有如下几个阶段: 1.面向对象分析(object oriented analysis ,OOA) 2 面向对象设计(object oriented design,OOD) 3 面向对象编程(object oriented programming,OOP) 4 面向对象测试(object oriented test,OOT) 5 面向对象维护(object oriendted soft maintenance,OOSM) 1 #对象:学校----->归类 2 #共有的特征:商标为

Python基础----面向对象编程介绍、类和对象

面向对象变成介绍 面向过程编程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西.主要应用在一旦完成很少修改的地方,如linux内核.git.apache服务器等 优点:极大的降低了程序的设计复杂度 缺点:可扩展性差,改动一个地方很可能要改多个地方,牵一发而动全身 面向对象编程:不是编程的全部,只是用来解决软件可扩展性的 核心是对象(上帝式思维),对象作为程序的基本单元,一个对象包含了数据和操作数据的函数.面向对象就是把计算