面向对象高级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这个词的翻译一直都有问题, 很多人把它翻译为属性, 其实是不恰当和不准确的. 在这里翻译成特性是为了和属性区别开来. 属性是指的 ...
随机推荐
- DVWA File Upload 通关教程
File Upload,即文件上传.文件上传漏洞通常是由于对上传文件的类型.内容没有进行严格的过滤.检查,使得攻击者可以通过上传木马获取服务器的webshell权限,因此文件上传漏洞带来的危害常常是毁 ...
- Eureka工作原理分析
demo源码地址:https://github.com/flyingJiang/SpringCloud 首先,单独使用Eureka. Eureka整合Ribbon 未完待续……
- mysql 字段修改汇总
-- 增加 ALTER TABLE `gdm_nursing_patient` ADD COLUMN `due_date` date DEFAULT NULL COMMENT '名称' AFTER ...
- mysql出生日期转成年龄
可以直接用数据库函数进行转换,省去java代码转换的麻烦 SELECT TIMESTAMPDIFF(YEAR, '1988/01/10', CURDATE()) 且此函数容错很好,就算是null,‘ ...
- GreenPlum 大数据平台--常用命令
gpstate 命令 参数 作用 gpstate -b => 显示简要状态 gpstate -c => 显示主镜像映射 gpstart -d => 指定数据目录(默认值:$MASTE ...
- 在Visual Studio中新增生成项目
在Visual Studio中新增生成项目 选择适配器类型 选择WCF-SQL适配器 创建连接选项 选择相应的存储过程 生成相应的消息架构
- MySQL 5.7.26安装及配置--windows10系统下
安装过程省略,下载包解压即可 一.配置my.ini在解压目录下,新建一个my.ini [mysql] default-character-set=utf8 [mysqld] port = 3306 b ...
- centos7 安装docker(手动和脚本安装)换源 卸载
centos7 安装docker(手动和脚本安装)换源 卸载 Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker ...
- Webpack 4 : ERROR in Entry module not found: Error: Can't resolve './src'
ERROR in Entry module not found: Error: Can't resolve './src' in 'E:\ASUS\Documents\VSCode files\Web ...
- 【转】常用PLC通讯协议
三菱FX系列PLC通讯测试 发送帧(Hex): 起始(STX) 02 命令(CMD) 30 首地址(ADDRESS) 30 30 41 30 字节数(BYTES) 30 31 终止(ETX) 03 校 ...