9.2(day28)断点调试,issubclass,isinstance,反射,内置方法

断点调试

一等公民

只要可以把一个东西赋值给一个变量,这个东西就叫做一等公民

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'

cmd = input('请输入命令')

方式一

print(F.dict[cmd])

F.dictcmd

if hasattr(p,cmd):

run = getattr(p,cmd) # 拿到run

run()

else:

print('命令不存在')

通过用户输入key和value往对象中赋值:

key = input('请输入key')

value = input('输入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'

a = input('请输入要删除的属性')

print(p.dict)

delattr(p,a)

print(p.dict)p.age = 18

删除对象中属性为name字符串的属性

判断一下对象中有没有输入的属性,有的话删除

p.name = 'lqz'

p.age = 18

p.sex = 'male'

cmd = input('输入要查询的属性')

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__对象加括号会调用它

enterexit

上下文管理器,本质原理

posted @ 2019-09-16 19:58  ZJJJJJJJ  阅读(322)  评论(0编辑  收藏  举报