day 24

一.异常

1.异常处理:避免程序因异常而奔溃,增强程序的健壮性
2.异常包含三个部分:
    1.traceback:异常的追踪信息
    2.异常的类型
    3.异常的信息
3.错误分成两大类:
    1.逻辑上的错误
    2.语法上的错误:在程序运行前就应该立即修正
用法:(当检测到异常时,异常代码的后面代码就不会再执行下去)
1.单分支:
try:
    代码块1:
    代码块2
    代码块3
except NameError:
    print()


2.多分支:
try:
    代码块1:
    代码块2
    代码块3
except Name1Error:
    print()
except Name2Error:
    print()

3.try....else.....: #当前面的代码没有检测到异常时,执行else的代码
try:
    代码块1:
    代码块2
    代码块3
except Name1Error:
    print()
except Name2Error:
    print()
else:
    print()
4.try.......final....  #无论被检测的代码有没有异常都会执行(控制系统资源)
try:
    代码块1:
    代码块2
    代码块3
except Name1Error:
    print()
except Name2Error:
    print()
else:
    print()
final :
    print()

二.元类:源自于一句话:在Python中一切皆对象
调用元类 >>>得到自定义类>>>>>(调用)>>>得到自定义的对象
class关键字自定义创建类的底层工作原理:
1.拿到类的名字:class_name
2.拿到类的基类:class_base
3.拿到类的名称空间:class_dict >>>exec()
4.调用type()
自定义一个元类:
class oldboy:
school="oldboy"
def __init__(self,name,age):
self.name=name
self.age=age

class_name="oldboy"
class_base=(object,)
class_dict={}
class_body="""
school="oldboy"
def __init__(self,name,age):
self.name=name
self.age=age
"""
exec(class_body,{},class_dict)

People=type(class_name,class_base,class_dict)
p=People("jxl",18)
print(p.__dict__)

 

三.自定义元类控制类的产生:(__init__)

class Mymata(type):
    def __init__(self,class_name,class_base,class_dict):
        if class_name.islower():
            raise TypeError("类名为驼峰体")  #使类的名字必须为驼峰体
        
        doc = class_dict.get("__doc__")     #类中的必须有文档注释
        if doc is None or len(doc)==0 or len(doc.strip("\n "))==0:
            raise TypeError("类中必须要文档注释")

class Oldboy(object,metaclass=Mymata):
        '''
            
        '''
        school="oldboy"
        def __init__(self,name,age,sex):
            self.name=name
            self.age=age
            self.sex=sex

四.自定义类来控制类调用的过程(__call__)

总结:对象之所以可以调用,是因为对象的函数中有一个__call__函数.
创建一个对象的过程
1.产生一个空对象   obj=self.__new__(self)
2.对空对象进行初始化操作(将空对象连同括号内的参数一起传给类中的__init__函数中)self.__init__(obj,*args,**kwargs)
3.返回初始化  return obj

class Mymata(type):
    def __call__(self, *args, **kwargs):
       #得到一个空对象
        obj=self.__new__(self)
       #对对象进行初始化
        self.__init__(obj,*args, **kwargs)
        #返回初始化好的对象
        return  obj


class Oldboy(object, metaclass=Mymata):
    school = "oldboy"

    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex

o=Oldboy("jxl",11,'')

 

posted @ 2018-08-27 17:35  jiangxiaolong_mrx  阅读(110)  评论(0编辑  收藏  举报