2.2 学python 类2

1.metaclass ,类的祖宗

#python里面一切都是对象
class Foo: #默认继承 object
    def func(self):
        print('yanga11ang')
'''--------------------------------------------------------------'''
def func(self):
    print(123)
Foo=type('Foo',(object,),{'func':function}) #类的第二中声明方式
obj=Foo() #obj是对象,Foo类
# foo类也是一个对象,type 的对象
'''--------------------------------------------------------------'''
class Mytype(type):
    def __init__(self,×args.**kwargs):
        pass

class Foo(object,metaclass=Mytype): #由自己的写的type创建类
    def func(self):
        pass
#Foo类这个对象是由 Mytype类创建的
'''
类名后面加上括号,先执行type的__call__方法
__call__方法调用__new__ 方法
__new__方法会创建一个对象并 返回对象
'''

这里写图片描述
2.异常处理

try:
    pass# 代码块,逻辑 出现错误,不再执行下面的逻辑,进入异常
except ValueError as e: # 如果上面的代码块错误类型是ValueError
    pass # 执行这个模块
except Exception as e: #如果上面错误类型都不相符,执行这个
    #e是Exception 对象,对象中封装了错误信息
    pass
else :
    pass #不出错执行
finally:
    pass #不管出不出错都执行

#主动触发异常
try:
    raise Exception('不过了')
except Exception as e:
    str_error=str(e)
    pass

#自定义异常,可用于主动触发
class MyError(Exception):
    def __init__(self,msg):
        self.msg=msg

    def __str__(self):
        return self.msg

#断言assert 条件 一般不捕获,用于 如果条件不符,程序没法运行下去的错误
assert 1==2 #条件成立,没有用,条件不成立报错 AssertionError
常见错误
AttributeError #试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
IOError #输入/输出异常;基本上是无法打开文件
ImportError #无法引入模块或包;基本上是路径问题或名称错误
IndentationError #语法错误(的子类) ;代码没有正确对齐
IndexError #下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
KeyError #试图访问字典里不存在的键
KeyboardInterrupt #Ctrl+C被按下
NameError #使用一个还未被赋予对象的变量
SyntaxError #Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
TypeError #传入对象类型与要求的不符合
UnboundLocalError #试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,导致你以为正在访问它
ValueError #传入一个调用者不期望的值,即使值的类型是正确的
更多错误
ArithmeticError
AssertionError
AttributeError
BaseException
BufferError
BytesWarning
DeprecationWarning
EnvironmentError
EOFError
Exception
FloatingPointError
FutureWarning
GeneratorExit
ImportError
ImportWarning
IndentationError
IndexError
IOError
KeyboardInterrupt
KeyError
LookupError
MemoryError
NameError
NotImplementedError
OSError
OverflowError
PendingDeprecationWarning
ReferenceError
RuntimeError
RuntimeWarning
StandardError
StopIteration
SyntaxError
SyntaxWarning
SystemError
SystemExit
TabError
TypeError
UnboundLocalError
UnicodeDecodeError
UnicodeEncodeError
UnicodeError
UnicodeTranslateError
UnicodeWarning
UserWarning
ValueError
Warning
ZeroDivisionError

更多异常

3.反射

# 通过字符串的形式,操作对象中的成员
#python 执行效率比较高
class  Foo:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def show(self):
        return name

#一种实现方法
obj=Foo()
b='name'
obj.__dict__['name']
#第二种 内置函数,从对象里面获取成员
v=getattr(obj,'name')
func=getattr(obj,'show')
func()
hasattr(obj,'name') #判断是否有
setattr(obj,'k1','name') #设置k1 成为 ’name‘
delattr(obj,'name') #删除 name成员
#对象级别,类级别,模块级别

4.单例模式

#单例,用于使用同一份实例(对象)
class Foo:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def show(self):
        print(self.name,self.age)
v=None
while True:
    if v:
        v.show()
    else:
        v=Foo()
        v.show()

class Foo:
    __v=None

    @classmethod  #修饰符对应的函数不需要实例化
    def get_instance(self):
        if cls.__v:
            return cls.__v
        else:
            cls.__v=Foo()
            return cls.__V

#使用单例模式的时候不用 Foo() 而是用get_instance()
obj=Foo.get_instance()
#应用场景 数据库链接池
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值