断点调试
一等公民
只要可以把一个东西赋值给一个变量,这个东西就叫做一等公民
def test3():
print('3333')
def test():
def test2():
test3()
print(i)
return test2
print('xxxx')
print('第一句话')
test()()
print('4444')
断掉调试,在代码前点一下,会有一个红色的小圆圈
只要不走,代码会一直断在断点处 debug模式运行
debug检测窗口 console一般的执行窗口
断点加在报错之前 绿色箭头,快速调到下一个断点
下箭头不会进去函数内部(单步调试,程序一步一步走),斜箭头会进入函数内部,断点调试不会回头
运行时报错行数为当时行数
控制台报错点最后一行,在错误代码上加断点调试
灰色跳过,卡在红色
issuFbclass isinstance
issubclass:判断第一个类是不是第二个类的子类,返回True,False
class F:
pass
class B():
pass
class T(B):
pass
print(B.bases)
print(issubclass(B,F))
print(issubclass(F,B))
print(issubclass(T,F)) # 子类的子类也可以判断
isinstance:判断第一个参数是不是第二个参数的对象,返回 True,False
class F:
pass
class T:
pass
f = F()
print(isinstance(f,F))
print(isinstance(f,T))
反射:值程序可以访问,检测,修改它本身状态或行为的一种能力
通过字符串获取删除判断设置属性和方法
python中简单:通过字符串操作相关属性
用户输入一段字符串,执行该字符串对应的方法
hasattr():判断是否在对象中
getattr();通过字符串获取属性和方法
setattr():通过字符串设置属性或方法
delattr():通过字符串删除属性或方法
class F:
def init(self,name):
self.name = name
def run(self):
print('run')
def speak(self):
print('speak')
p = F('1')
print(F.dict)
a = 'name'
方式一
print(F.dict[cmd])
if hasattr(p,cmd):
run = getattr(p,cmd) # 拿到run
run()
else:
print('命令不存在')
通过用户输入key和value往对象中赋值:
p.key = value
setattr(p,key,value)
print(p.age)
往对象中加方法属性
动态往对象中放方法:
def test(a):
print(a)
setattr(p,'test',test)
print(p.dict)
p.test(0)
原始删除属性
p.name = 'lqz'
print(p.dict)
del p.name
print(p.dict)
动态删除
p.name = 'lqz'
p.sex = 'male'
print(p.dict)
delattr(p,a)
print(p.dict)p.age = 18
删除对象中属性为name字符串的属性
判断一下对象中有没有输入的属性,有的话删除
p.name = 'lqz'
p.age = 18
p.sex = 'male'
if hasattr(p,cmd):
a = getattr(p,cmd)
print(a)
else:
print('该属性不存在')
模块也是对象,也可以使用这个四个方法
使用自己写的模块
内置方法,__开头的方法
str 如果不重写__str__ print会打印内存地址
repr 与__str__相似,用在交互式命令下,直接写变量名,会执行__repr__
如果重写了,会打印你想要的
class F:
# pass
# def __str__(self):
# print('xxxxx')
# return 'xxxxx'
f = F()
相当于 print(f.str())
print(f)
setattr,delattr,getattr
点拦截方法
如果去对象中取属性娶不到,会进入__getattr__
如果去对象中赋值属性,一旦取不到,会进入__setattr__
如果删除对象中的属性,会进入__delattr__
class F:
def init(self,name):
self.name = name
# def __ge(x'tattr__(self, item):
# print('xxxxx')
# def __setattr__(self,key,value):
# print('yyyyy')
# def __delattr__(self, item):
# print('zzzzz')
f = F('nick')
print(f.name)
print(f.dict)
print(f.name)
f.sex = 'male'
del f.name
之前字典的使用方法
di = dict(name = 'lqz',age = 18)
print(di)
print(di['name'])
print(di.name)
写一个类继承字典
class Mydict(dict):
def init(self,**kwargs):
super().init(**kwargs)
def getattr(self,item):
# print(item)
return self[item]
def setattr(self, key, value):
self[key] = value
di = Mydict(name='lqz',age=18)
# print(di['name'])
di['sex'] = 'male'
print(di.sex)
__item__系列,对象通过[]取值,赋值,删除值,
__call__对象加括号会调用它
enter 和 exit
上下文管理器,本质原理