反射:通过字符串去找到真实的属性,然后去进行操作

python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

1、两种方法访问对象的属性

  1. class Foo:
  2. x=1
  3. def __init__(self,name):
  4. self.name=name
  5.  
  6. def f1(self):
  7. print('from f1')
  8.  
  9. f=Foo('egon')
  10. print(f.__dict__)

方式一:访问那么对应的值

  1. print(f.name)

方式二:

  1. print(f.__dict__['name'])

2、反射

2.1、hasattr判断属性

  1. class Foo:
  2. x = 1
  3.  
  4. def __init__(self, name):
  5. self.name = name
  6.  
  7. def f1(self):
  8. print('from f1')
  9.  
  10. f = Foo('egon')
  11. print(hasattr(f, 'name')) # f.name 判断f对象里有没有name这个属性,一定得是字符串形式的name
  12. print(hasattr(f, 'f1')) # f.f1
  13. print(hasattr(f, 'x')) # f.x

2.2、setattr 设置属性

  1. class Foo:
  2. x = 1
  3. def __init__(self, name):
  4. self.name = name
  5.  
  6. def f1(self):
  7. print('from f1')
  8. f = Foo('egon')
  9.  
  10. setattr(f,'age',18)#f.age=18 f设置一个age属性
  11. print(f.age)

2.3、getattr 获取属性

  1. class Foo:
  2. x = 1
  3. def __init__(self, name):
  4. self.name = name
  5.  
  6. def f1(self):
  7. print('from f1')
  8. f = Foo('egon')
  9.  
  10. print(getattr(f,'name'))#f.name
  11. print(getattr(f,'abc',None))#f.abc
  12. print(getattr(f,'name',None))#f.abc
  13.  
  14. func = getattr(f, 'f1') # f.f1
  15. print(func)
  16. func()

2.4、delattr 删除属性

  1. class Foo:
  2. x = 1
  3. def __init__(self, name):
  4. self.name = name
  5.  
  6. def f1(self):
  7. print('from f1')
  8. f = Foo('egon')
  9. delattr(f,'name')# del f.name
  10. print(f.__dict__)

3、反射的用法 

  1. class Ftpserver:
  2. def __init__(self, host, port):
  3. self.host = host
  4. self.port = port
  5.  
  6. def run(self):
  7. while True:
  8. cmd = input('>>: ').strip()
  9. if not cmd: continue
  10. if hasattr(self, cmd): # 首先判断self(对象)里有没有用户输入的功能
  11. func = getattr(self, cmd) # 用户输入的命令是个字符串,应该把字符串反射到正真的属性上
  12. func()
  13.  
  14. def get(self):
  15. print('get func')
  16.  
  17. def put(self):
  18. print('put func')
  19.  
  20. f = Ftpserver('192.168.1.2', 21)
  21. f.run()

  

day7_python之面向对象高级-反射的更多相关文章

  1. CSIC_716_20191129【面向对象高级----反射、类的内置方法(魔法方法)、单例模式】

    反射 反射是通过'字符串'对 对象的属性进行操作,反射有四个内置的方法. hasattr 通过字符串 判断对象的属性或者方法是否存在 getattr 通过字符串  获取对象的属性或者方法        ...

  2. Day08:继承与派生,多态,封装,绑定与非绑定方法,面向对象高级(反射,__str__,__del__)

    上节课复习:1.编程思想    面向过程        核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么后干什么        基于该思想编写程序就好比在设计一条流水线,是一种机械式的思维 ...

  3. 简学Python第七章__class面向对象高级用法与反射

    Python第七章__class面向对象高级用法与反射 欢迎加入Linux_Python学习群  群号:478616847 目录: Python中关于oop的常用术语 类的特殊方法 元类 反射 一.P ...

  4. python高级之面向对象高级

    python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两种,不像c++中的类有公有成员(pu ...

  5. Python自动化 【第七篇】:Python基础-面向对象高级语法、异常处理、Scoket开发基础

    本节内容: 1.     面向对象高级语法部分 1.1   静态方法.类方法.属性方法 1.2   类的特殊方法 1.3   反射 2.     异常处理 3.     Socket开发基础 1.   ...

  6. 第五篇:python高级之面向对象高级

    python高级之面向对象高级   python高级之面向对象高级 本节内容 成员修饰符 特殊成员 类与对象 异常处理 反射/自省 单例模式 1.成员修饰符 python的类中只有私有成员和公有成员两 ...

  7. Python 面向对象之反射

    Python 面向对象之反射 TOC 什么是反射? hasattr getattr setattr delattr 哪些对象可以使用反射 反射的好处 例子一 例子二 什么是反射? 程序可以访问.检查和 ...

  8. C++面向对象高级编程(九)Reference与重载operator new和operator delete

    摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...

  9. C++面向对象高级编程(八)模板

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...

随机推荐

  1. spring mvc 引入log4日记记录maven工程 slf4j和log4j输出到控制台配合使用log4j不输出到文件

    https://blog.csdn.net/qq_27093465/article/details/62928590 使用slf4j的优点: 提供带参数的日志输出方法(SLF4J 1.7及以后版本). ...

  2. Redis数据库在ubuntu16.04下的安装

    1.安装 sudo apt-get install redis-server 2.启动 sudo service redis-server start 3.查看 ps aux|grep redis 4 ...

  3. 洛谷 3112 [USACO14DEC]后卫马克Guard Mark——状压dp

    题目:https://www.luogu.org/problemnew/show/P3112 状压dp.发现只需要记录当前状态的牛中剩余承重最小的值. #include<iostream> ...

  4. Chrome进行多分辨率测试

    在Web开发中,经常需要在不同的浏览器分辨率下进行测试,以确认页面是否可以适应不同的分辨率. 下载Resolution Test扩展程序 下载地址:http://pan.baidu.com/s/1gf ...

  5. 对C语言内存对齐的初步了解

    在解释内存对齐的作用前,先来看下内存对齐的规则: 1. 对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min(#pragma pack()指定的数,这个数据成员的自身 ...

  6. JRE System Library、Referenced Libraries、Web App Libraries的含义

    JRE System Library.Referenced Libraries.Web App Libraries 这三个都是jar包的存放集合. JRE System Library:指Java S ...

  7. python基础知识--标志位的设定

    在单层循环的退出中,使用break即能退出,那么多层循环呢?机智的人们使用flag标识符的方式,例如: exit_flag = False for i in range(10): if i <5 ...

  8. DirectX11笔记(三)--Direct3D初始化2

    原文:DirectX11笔记(三)--Direct3D初始化2 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u010333737/article/ ...

  9. tcpdump抓取udp报文

    使用tcpdump命令抓取UDP 2000端口报文,并将报文保存到当前目录下的udp.cap文件,命令如下: tcpdump -i 网络接口名称 udp port 2000 -w ./udp.cap ...

  10. Vue项目中出现Loading chunk {n} failed问题的解决方法

    最近有个Vue项目中会偶尔出现Loading chunk {n} failed的报错,报错来自于webpack进行code spilt之后某些bundle文件lazy loading失败.但是这个问题 ...