面向对象高级A(反射,拦截方法)
一等公民:只要可以把一个东西赋值给一个变量,这个东西就叫一等公民
断点调试
在想要加断点的地方用鼠标点击一下,会看到一个红色圆圈
变红的地方,程序执行到,就会暂停
断点应该加在报错之前,在错误代码上放断点进行调试
向下绿色箭头是单步调试
右下角色绿色三角形是快速调到下一个断点执行
控制台报错,点击你能看懂的最后一行,光标会定位到错误代码
issubclass()
判断第一个类是不是第二个类的子类,返回true或者false
class Foo:
pass
class Bar(Foo):
pass
class Tt(Bar):
pass
print(Tt.__bases__) #(<class '__main__.Bar'>,)
print(issubclass(Bar, Foo)) # True
print(issubclass(Tt, Foo)) # True
isinstance()
判断第一个参数是不是第二个参数的对象,返回True或者False
class Foo:
pass
class Tt:
pass
f = Foo()
print(isinstance(f, Foo)) # true
print(isinstance(f, Tt)) # false
反射
hasattr(): 判断一个属性是否在对象中,返回true或者false
getattr():通过字符串获取属性或方法,如果获取到了,就会返回相应的属性或方法
settattr():通过字符串来设置属性或方法
delattr():通过字符串来删除属性或方法
class Foo:
def run(self):
print('run')
def speak(self):
print('speak')
p = Foo()
cmd = input('请输入命令')
if hasattr(p, cmd):
cmd1 = getattr(p, cmd)
cmd1()
else:
print('该命令不存在')
‘’‘
请输入命令:run
run
请输入命名:a
该命令不存在
’‘’
# 动态的加属性
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
p = Person('nick', 19)
key=input('请输入key: ')
value=input('输入value: ')
setattr(p,key,value)
print(p.age)
print(p.__dict__)
'''
请输入key:nick
输入value:123
19
{'name': 'nick', 'age': 19, 'nick': '123'}
'''
# 动态的删属性
p.name = 'lqz'
p.age = 18
p.sex = 'male'
a = input('请输入要删除的属性: ')
print(p.__dict__)
delattr(p, a)
print(p.__dict__)
"""
请输入要删除的属性: sex
{'name': 'lqz', 'age': 18, 'sex': 'male'}
{'name': 'lqz', 'age': 18}
"""
# 动态的加方法
# 需要先写一个函数,然后通过setattr()往对象中加方法
def test(a):
print(a)
print(p.__dict__)
setattr(p, 'test', test)
print(p.__dict__)
p.test(0) # 0
#模块也是对象,也可以用这四个方法
#内置模块
import os
print(hasattr(os, 'path1')) #False
#使用自己写的模块,通过反射来获取模块中是否有我要使用的属性或方法,如果有就执行,没有就报错
#这种方法可以用在:我想调用别人写的模块,但是我并不知道他写没写完,所以我需要用到hasattr先判断是否存在,存在的话用getattr拿到它,否则抛异常
'''
#别人写的,领导规定要写speak,run,eat方法
#这个人没写完
#utils.py
def speak():
print('speak')
def run():
print('run')
#这个人写完了
#def eat():
print('eat')
#opera.py
import utils
if hasattr(utils, 'eat')
eat = getattr(utils, 'eat')
eat()
else:
print('那个人还没写完呢')
# 那个人还没写完呢
'''
内置方法
__str__
class Foo:
def __init__(self, name):
self.name = name
def __str__(self):
return '['+self.name+']'
f = Foo('nick')
print(f) #print会按照__str__里面重写的格式进行打印
# print(f.__str__()) # 打印结果同上: [nick]
l = [1, 2, 3]
print(l) # [1, 2, 3]本质也是调用list的__str__方法
点拦截方法
如果去对象中取属性,一旦取不到,会进入__getattr__
如果去对象中赋值属性,一旦取不到,会进入到__setattr__
如果删除对象中的属性,会进入__delattr__
class Foo:
def __init__(self, name):
self.name = name # name没拿到值,要进入到__setarr__中,
# 找到后打印出来name的值 'nick'
print(name)
def __getattr__(self, item):
return '没有这个字段'
def __setattr__(self, key, value):# key值是参数name,
# value是值'nick'
print(key)
print(value)
def __delattr__(self, item):
print('zzzz')
f = Foo('nick') # 生成对象调用__init__方法,
print(f.name) #重写了__setattr__, 所以找不到name,这样就会进入__getattr__中
#######
#小例子#
#######
# 写一个类继承字典, 让他可以.取值,也可以中括号取值
class Mydict(dict):
def __init__(self, **kwargs):
super().__init__(**kwargs)
def __getattr__(self, item):
# pass
return self[item]
di = Mydict(name = 'lqz', age = 18)
print(di['age'])
print(di.name) #点取值找不到,
# 会触发__getattr__,继承了字典,直接利用key返回value
[]中括号拦截
__item__系列, 对象通过[]中括号取值,赋值删除值的时候会调用
#实现机理和.拦截一样,只不过是对象
# 用中括号调用时会触发
class Foo:
def __init__(self, name):
self.name = name
def __getitem__(self, item):
name = getattr(self, item) # 通过反射
# 拿到nick,并返回,这句话之后可
# 以使用中括号进行取值
return name
def __setitem__(self, key, value):
print('obj[key] = lqz赋值时, 执行我')
self.__dict__[key] = value # 赋值时进行保存
def __delitem__(self, key):
print('del obj[key]时,执行我')
self.__dict__.pop(key) # 删除时调用
f = Foo('nick')
f['name'] = 'ljy'
del f['name']
# print(f.name)
print(f['name'])
()对象加小括号拦截
_call_
class Foo:
def __call__(self):
print('xxxx')
f = Foo()
f()
# xxxx
面向对象高级A(反射,拦截方法)的更多相关文章
- Day08:继承与派生,多态,封装,绑定与非绑定方法,面向对象高级(反射,__str__,__del__)
上节课复习:1.编程思想 面向过程 核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么后干什么 基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维 ...
- Python面向对象高级编程:@property--把方法变为属性
为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数: >>> ...
- 简学Python第七章__class面向对象高级用法与反射
Python第七章__class面向对象高级用法与反射 欢迎加入Linux_Python学习群 群号:478616847 目录: Python中关于oop的常用术语 类的特殊方法 元类 反射 一.P ...
- day7_python之面向对象高级-反射
反射:通过字符串去找到真实的属性,然后去进行操作 python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 1.两种方法访问对象的属性 cl ...
- python高级之面向对象高级
python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两种,不像c++中的类有公有成员(pu ...
- Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础
本节内容: 1. 面向对象高级语法部分 1.1 静态方法.类方法.属性方法 1.2 类的特殊方法 1.3 反射 2. 异常处理 3. Socket开发基础 1. ...
- 第五篇:python高级之面向对象高级
python高级之面向对象高级 python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两 ...
- python 面向对象高级应用(三)
目录: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__getattr__ 二次加工标准类型(包装) __ ...
- Python第七章-面向对象高级
面向对象高级 一. 特性 特性是指的property. property这个词的翻译一直都有问题, 很多人把它翻译为属性, 其实是不恰当和不准确的. 在这里翻译成特性是为了和属性区别开来. 属性是指的 ...
随机推荐
- mysql出生日期转成年龄
可以直接用数据库函数进行转换,省去java代码转换的麻烦 SELECT TIMESTAMPDIFF(YEAR, '1988/01/10', CURDATE()) 且此函数容错很好,就算是null,‘ ...
- MATLAB 赋值命令计算结果在命令窗口显示结果
MATLAB 赋值命令计算结果在命令窗口显示结果 MATLAB如何控制计算结果是否显示在命令窗口 在运算结方程或者设定参数后面加分号也就是 ; 命令窗口就不会显示这些参数或结果了.举个例子clccle ...
- OIDC-Open ID Connect
OpenID Connect的简称,OIDC=(Identity, Authentication) + OAuth 2.0.它在OAuth2上构建了一个身份层,是一个基于OAuth2协议的身份认证标准 ...
- Javascript笔记:作用域和执行上下文
一.作用域 Javascript的作用域规则是在编译阶段确定的,有声明时的位置决定. JS中有全局作用域,函数作用域,块级作用域(ES6引入). 1. 全局作用域 在整个程序生命周期内都是有效的,在任 ...
- 为什么我的resharper控件安装之后没有显示
Resharper和Resharper C++有时候会出现,安装之后不显示,VisualStudio菜单栏内找不到的情况,大多数是因为启动VisualStudio的时候没有激活Resharper. 安 ...
- 用欧拉计划学Rust语言(第7~12题)
最近想学习Libra数字货币的MOVE语言,发现它是用Rust编写的,所以先补一下Rust的基础知识.学习了一段时间,发现Rust的学习曲线非常陡峭,不过仍有快速入门的办法. 学习任何一项技能最怕没有 ...
- python之函数filter、reduce
---恢复内容开始--- 一.filter函数 filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表. 该接收两个参数,第一个为函数,第二个为序列,对序列中每个元 ...
- scrapy 使用
启动方式: 写一个启动文件,与配置文件同级 from scrapy.cmdline import execute import sys,os sys.path.append(os.path.dir ...
- vue单页面引入CDN链接
不想在index.html文件中全局引入CDN资源,那么如何在Vue单文件组件中引入?下面来瞅瞅~ 虚拟DOM创建 Vue 通过创建一个虚拟 DOM 来追踪自己要改变的真实 DOM 什么是虚拟DOM? ...
- 《 .NET并发编程实战》阅读指南 - 第4章
先发表生成URL以印在书里面.等书籍正式出版销售后会公开内容.