大家好我是程序员_蓝天, 本文是为了方便初学者能够快速学习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__)并且把一些复杂判断从类中剥离出来,使得代码结构清晰