一、高级特性OOP
1、使用__slots__(2个下划线)
(1)在使用对象实例的时候给与对象添加方法或者属性
class Student(object):
pass
s = Student
s.age = 6 #添加age属性
from type import MethodType
def setAge(self,age):
self.age = age
s.setAge = MethodType(s,setAge) #添加setAge方法
上述的方法仅仅局限与某一个对象实例,若要整个类都有该方法:
Student.setAge = setAge #原来的class 类源文件仍然没有改变
(2)限制一个仅有某些属性,利用__slots__
def Student(object):
__slots__ = ('name','age') #使用一个tuple来表示该类所有的属性
2、@property装饰器
def Student(object):
@property
def name(self):
return self._name
@name.setter
def setName(self,name):
self.name = name
在getter方法加上@property使其变为属性,只可读。在setter方法加上xxx.setter 则该属性可写
s = Student()
s.name = 'Jamson'
3、多继承
def Animal(object):
pass
def Runable(object):
pass
def Dog(Animal,Runable):
pass
该设计模式被称为Mixln,子类拥有所有父类的所有方法
4、__str__方法类似与java中的toString方法
def Man(object):
def __init__(self,name):
self.name = name
def __str__(self):
return 'Man (name is %s' % self.name
__repr__ = __str__#两个方法基本上是一样的
5、枚举enum
from enum import Enum
Gender = Enum('Gender',('man','woman'))
Gender.man
或者定义个枚举类
from enum import Enum,unique
@unique #检查枚举值是否唯一
class Gender(Enum):
man = 0
woman = 1
6、元类metaclass
先定义元类,再定义类,在创建实例
class ListMetaclass(type):
def __new__(cls,name,bases,attrs):
attrs['add'] = lambda self,value: self.append(value)
return type.__new__(cls,name,bases,attrs)
class MyList(list,metaclass = ListMetaclass):#使得list有add方法
pass
__new__()接收到的参数:
(1)当前准备创建类的对象cls
(2)类的名字name
(3)类继承的父类集合bases
(4)类的方法的集合 attrs
二、异常处理
1、基本结构
try.....except......finally....
try:
print('try...')
r = 10 / 0
print(r)
except ZeroDivisionError as e:
print(e)
finally:
print('finally')
print('END')
2、记录错误
在except的处理中
except ValueError as e:
logging.exception(e)
3、抛出异常raise
4、单步调试
python3 -m pdb err.py
进入单步调试模式后
输入 l 表示查看源码
输入 n 表示执行下一条语句
输入 p 变量名 查看变量的值
输入 q 结束单步调试
5、pdb.set_trace()
在模块中,引入import pdb, 在代码中嵌入pdb.set_trace(),运行时,每遇到一个pdb.set_trace()就会暂停运行
除了可用单步调试的命令外,还可以用c表示继续运行
6、logging()
import logging
logging.basicConfig(level = logging.INFO)#指定记录信息的级别
logging.info('Error %s' % name)#输出一段文本
此外的信息级别还有debug,info,warning,error