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

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

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

class Foo:
x=1
def __init__(self,name):
self.name=name def f1(self):
print('from f1') f=Foo('egon')
print(f.__dict__)

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

print(f.name)

方式二:

print(f.__dict__['name'])

2、反射

2.1、hasattr判断属性

class Foo:
x = 1 def __init__(self, name):
self.name = name def f1(self):
print('from f1') f = Foo('egon')
print(hasattr(f, 'name')) # f.name 判断f对象里有没有name这个属性,一定得是字符串形式的name
print(hasattr(f, 'f1')) # f.f1
print(hasattr(f, 'x')) # f.x

2.2、setattr 设置属性

class Foo:
x = 1
def __init__(self, name):
self.name = name def f1(self):
print('from f1')
f = Foo('egon') setattr(f,'age',18)#f.age=18 给f设置一个age属性
print(f.age)

2.3、getattr 获取属性

class Foo:
x = 1
def __init__(self, name):
self.name = name def f1(self):
print('from f1')
f = Foo('egon') print(getattr(f,'name'))#f.name
print(getattr(f,'abc',None))#f.abc
print(getattr(f,'name',None))#f.abc func = getattr(f, 'f1') # f.f1
print(func)
func()

2.4、delattr 删除属性

class Foo:
x = 1
def __init__(self, name):
self.name = name def f1(self):
print('from f1')
f = Foo('egon')
delattr(f,'name')# del f.name
print(f.__dict__)

3、反射的用法 

class Ftpserver:
def __init__(self, host, port):
self.host = host
self.port = port def run(self):
while True:
cmd = input('>>: ').strip()
if not cmd: continue
if hasattr(self, cmd): # 首先判断self(对象)里有没有用户输入的功能
func = getattr(self, cmd) # 用户输入的命令是个字符串,应该把字符串反射到正真的属性上
func() def get(self):
print('get func') def put(self):
print('put func') f = Ftpserver('192.168.1.2', 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. 想真正了解JAVA设计模式看着一篇就够了。 详解+代码实例

    Java 设计模式   设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结 设计模式分为 23 种经典的模式,根据用途我们又可以分为三大类.分别是创建型模式.结构型模式和行为型模式 列举几种设 ...

  2. Vue. 之 Element table 单元格内容隐藏

    Vue. 之 Element table 单元格内容隐藏 在table显示数据时,若某个单元格的内容过多,需要进行隐层,在这一列的单元格属性添加::show-overflow-tooltip=&quo ...

  3. git pull 总提示让输入merge 信息

    在生产环境拉去代码的时候,总是出现了 .git/MERGE_MSG,很烦. 虽然每次可以通过输入 :q 命令,取消,然后完成拉取.但是这样就很影响效率.解决办法一: 欺骗自己法只要我没看见这个问题,这 ...

  4. leetcode 31-40 easy

    38.Count and Say The count-and-say sequence is the sequence of integers with the first five terms as ...

  5. python实现六大分群质量评估指标(兰德系数、互信息、轮廓系数)

    python实现六大分群质量评估指标(兰德系数.互信息.轮廓系数) 1 R语言中的分群质量--轮廓系数 因为先前惯用R语言,那么来看看R语言中的分群质量评估,节选自笔记︱多种常见聚类模型以及分群质量评 ...

  6. 【JZOJ3215】【SDOI2013】费用流

    ╰( ̄▽ ̄)╭ 对于一张给定的 运输网络 ,Alice 先确定一个最大流 ,如果有多种解, Alice 可以任选一种: 之后 Bob在每条边上分配单位花费 (单位花费必须是非负实数), 要求所有边的单 ...

  7. python ndarray相关操作:重构

  8. prestashop 首页轮播幻灯片图片修改

    后台 -> Modules -> Modules 搜索 home(中文则搜幻灯片)

  9. PHP定时任务获取微信access_token的方法

    一.使用brew安装php多版本方法 # brew install php56# brew install php70二.安装切换工具 # brew install php-version# sour ...

  10. MSSQL 为db创建user

    use [IBatisNet]GO if not exists (select * from master.dbo.syslogins where loginname = N'IBatisNet')B ...