python 第十九章 反射、异常处理

60 阅读3分钟

大家好我是程序员_蓝天, 本文是为了方便初学者能够快速学习python,写的可能不是很好,希望大家多多包涵。 每个赞都是我前进的动力

一,反射

反射:通过字符串的形式进行操作对象的属性方法

1. 对象反射

  • getattr 获取指定对象的属性以及方法
  • setattr 设置对象属性
  • hasattr 判断对象是否有这个属性或者方法
  • delattr 删除对象的属性

class A:
    def __init__(self, name):
        self.name = name


a = A('jk')

# 变量名 = getattr(对象, 对象属性, 默认值)
# rest = getattr(a,"name", 'python')
# print(rest)
# print('-----------分隔符-----------')
# rest = getattr(a,"age", 'python')
# print(rest)


# setattr(对象,"对象属性", 值)
# setattr(a,'age',18)
# print(a.age)


# 变量名 = hasattr(对象,'对象属性')  返回的是bool
# rest = hasattr(a,'name')
# print(rest)


# delattr(对象,'对象属性)
# delattr(a, 'name')
del a.name
print(a.name)

二,异常

异常:就是在程序执行过程中有逻辑等其他错误导致异常,使得程序终止运行

异常处理:在程序运行过程中,发现错误对其进行处理,让程序可以正常执行不会因为这个错误而导致程序终止

1.异常错误

  • 语法错误: 语法错误可以避免---SyntaxError

  • 逻辑错误:

# TypeError   类型错误,
# NameError   变量名未定义
# IndexError   下标错误

2.异常处理

语法格式:

try:
    代码块(感觉有问题的代码)
except 异常类型:
    进行异常处理
else:
    代码没有异常执行代码

finally:
    不管有没有异常,都会执行这里
    
try:
    rst = '黄沙百战穿金甲,不破楼兰终不还'
    print(rst[40])
except IndexError as e:
    print('下标越界')
    print(e)
try:
    rst = '落红不是无情物,化作春泥更护花'
    print(rst[4])
except IndexError as e:
    print('下标越界')
    print(e)
    
else:
    print('语法正确')

finally:
    print('不管你 错误不错误,我就是要执行-----')

捕获所有的异常

try:
    rst = '落红不是无情物,化作春泥更护花'
    print(rst[4])
except Exception as e:
    print('下标越界')
    print(e)
    
else:
    print('语法正确')

finally:
    print('不管你 错误不错误,我就是要执行-----')

3. 断言(assert)

发送AssertionError 异常错误

assert 判断表达示式, 返回异常信息(当判断表达式为False执行)
# bool类型进行判断
x = 100
y =200
assert x < y, '你好’, ‘蓝天'

rst = '你是个帅哥'
# assert '丑' in rst, '说谁丑呢,找打,'
assert '帅' in rst, '说谁丑呢,找打,'

4. 自定义异常

raise Exception(返回异常的信息)
money = int(input('请输入金额'))
if money >500:
    print('交易成功,合作愉快,')
else:
    raise Exception(f'money不能小于500,当前money为{money},交易失败')

三,描述符

property其实就是描述符

# ------------描述符-----------
class MTDesc:
    def __init__(self):
        self.__value = None

    def __get__(self, instance, owner):
        print('-------->',instance)
        print('-------->',owner)
        return self.__value

    def __set__(self, instance, value):
        self.__value = value
        print('设置值')
        print('-------->',instance)

    def __delete__(self, instance):
        print('删除属性-----》')
        del self.__value

作用于类属性

# ------------描述符-----------
class MTDesc:
    def __init__(self):
        self.__value = None

    def __get__(self, instance, owner):
        print('-------->',instance)
        print('-------->',owner)
        return self.__value

    def __set__(self, instance, value):
        if not isinstance(value, str):
            raise Exception('value 值不正确,请设置 字符串类型')
        self.__value = value
        print('设置值')
        print('-------->',instance)

    def __delete__(self, instance):
        print('删除属性-----》')
		 del self.__value

class B:
    desc = MTDesc()


b = B()
# print(b.desc)
# print('---------------------')
b.desc = 123
print(b.desc)

实例属性

# ------------描述符-----------
class MTDesc:
    def __init__(self):
        self.__value = None

    def __get__(self, instance, owner):
        print('-------->',instance)
        print('-------->',owner)
        return self.__value

    def __set__(self, instance, value):
        if not isinstance(value, str):
            raise Exception('value 值不正确,请设置 字符串类型')
        self.__value = value
        print('设置值')
        print('-------->',instance)

    def __delete__(self, instance):
        print('删除属性-----》')


class B:
    desc = MTDesc()
    def __init__(self, desc):
        self.desc = desc


b = B('123')
# print(b.desc)
# print('---------------------')

print(b.desc)
del b.desc

小结:

​ 只要实现了__get__, __set__ __delete__ 这些方法,就是描述符

好处:

​ 可以控制属性的获取(__get__),设置(__set__)删除(__delete__)并且把一些复杂判断从类中剥离出来,使得代码结构清晰