1.metaclass,可以 把类看成是metaclass创建出来的“实例。按照默认习惯,metaclass的类名总是以Metaclass结尾,以便清楚地表示这是一个metaclass,可以用来进行动态修改。
metaclass是类的模板,所以必须从type
类型派生:
class ListMetaclass(type):
def __new__(cls, name, bases, attrs):
attrs['add'] = lambda self, value: self.append(value)
return type.__new__(cls, name, bases, attrs)
有了ListMetaclass,我们在定义类的时候还要指示使用ListMetaclass来定制类,传入关键字参数metaclass:
class MyList(list, metaclass=ListMetaclass):
pass
当我们传入关键字参数metaclass时,它指示Python解释器在创建MyList时,要通过ListMetaclass.new()来创建,在此,我们可以修改类的定义,比如,加上新的方法,然后,返回修改后的定义。
new()方法接收到的参数依次是:
当前准备创建的类的对象;
类的名字;
类继承的父类集合;
类的方法集合。
这样在调用MyList的实例的时候,就拥有了add()方法
2.异常处理
import logging
try:
print('try...')
r = 10 / int('2')
print('result:', r)
except ValueError as e:
print('ValueError:', e)
except Exception as e:
logging.exception(e)
else:
print('no error!')
finally:
print('finally...')
print('END')
抛出自己定义的异常
class FooError(ValueError):
pass
def foo(s):
n = int(s)
if n==0:
#使用raise进行抛出异常,可以直接使用raise那么就将异常抛到上一级
raise FooError('invalid value: %s' % s)
return 10 / n
foo('0')
3.可以在assert来进行判断代码逻辑。assert n != 0, ‘n is zero!’ 这表示如果n!=0那么就开始继续执行,否则就是报错 n is zero!
有debug,info,warning,error等几个级别
使用loggin进行日志的打印
import logging
logging.basicConfig(level=logging.INFO) #这里需要配置日志级别,否则不会打印日志
s = '0'
n = int(s)
logging.info('n = %d' % n)
print(10 / n)