反射

什么是反射?

  通过字符串的形式操作对象相关属性。python中的事物都是对象;

关键方法:

  (1)getattr:获取属性

  (2)setattr:设置属性

  (3)hashattr:检测是否含有属性,返回布尔值

  (4)delattr:删除属性

具体功能演示:

  1. class Foo:
  2.         f = '类对静态变量'
  3.         def __init__(self, name, age):
  4.                 self.name = name
  5.                 self.age = age
  6.  
  7.         def say_hi(self):
  8.                 print('hi, %s' % self.name)
  9.  
  10. obj = Foo('xiaofei', 20)
  11.  
  12. # 检测是否含有某属性
  13. print(hasattr(obj, 'name'))
  14. print(hasattr(obj, 'say_hi'))
  15. # 执行结果:
  16. # True
  17. # True
  18.  
  19. print('--------------------------------------')
  20.  
  21. # 获取属性:
  22. print(getattr(obj, 'name'))
  23. func = getattr(obj, 'say_hi')
  24. func()
  25. print(getattr(obj, 'aaaaa', '不存在!'))
  26.  
  27. # 执行结果:
  28. # xiaofei
  29. # hi, xiaofei
  30. # 不存在!
  31.  
  32. print('--------------------------------------')
  33.  
  34. # 设置属性
  35.  
  36. setattr(obj, 'gender', 'female')
  37. setattr(obj, 'show_name', lambda self: self.name + 'er')
  38. print(obj.gender)
  39. print(obj.show_name(obj))
  40.  
  41. # 执行结果:
  42. # female
  43. # xiaofeier
  44.  
  45. print('--------------------------------------')
  46.  
  47. # 删除属性
  48. delattr(obj, 'age')
  49. delattr(obj, 'show_name')
  50. print(obj.__dict__)
  51. # 执行结果:
  52. # {'gender': 'female', 'name': 'xiaofei'}
  53.  
  54. delattr(obj, 'aaaa') # 删除不存在对属性,会报错
  55.  
  56. 实例中的用法:
  57.  
  58. import os
  59. class Manage_cmd(object):
  60.         def run(self):
  61.                 while True:
  62.                         cmd = input('>>>').strip()
  63.                         if not cmd: continue
  64.                         if hasattr(self, cmd):
  65.                                 func = getattr(self, cmd)
  66.                                 func()
  67.                         else:
  68.                                 print('-bash: %s: command not found' % cmd)
  69.  
  70.         def ls(self):
  71.                 print(os.listdir('.'))
  72.  
  73. cmd = Manage_cmd()
  74. cmd.run()
  75.  
  76. # 执行结果:
  77. # >>>ls
  78. # ['test1.py']
  79. # >>>asdfadf
  80. # -bash: asdfadf: command not found

反射功能演示代码

1. 反射不仅仅只能用在属性上,也可以用在方法上

  1. class Foo(object):
  2.         staticField = 'hello world.'
  3.  
  4.         def __init__(self):
  5.                 self.name = 'hkey'
  6.  
  7.         def test(self):
  8.                 return 'test'
  9.  
  10.         @staticmethod
  11.         def bar():
  12.                 return 'bar'
  13.  
  14. print(getattr(Foo, 'staticField'))
  15. print(getattr(Foo, 'test'))
  16. func = getattr(Foo, 'bar')
  17. print(func())
  18.  
  19. # 执行结果:
  20. # hello world.
  21. # <function Foo.test at 0x00000141FE18D158>
  22. # bar

反射类的方法

2. 反射当前文件(模块)成员

  1. import sys
  2.  
  3. def s1():
  4.         print('s1')
  5.  
  6. def s2():
  7.         print('s2')
  8.  
  9. this_module = sys.modules[__name__]
  10. print(hasattr(this_module, 's1'))
  11. func = getattr(this_module, 's2')
  12. func()
  13.  
  14. # 执行结果:
  15. # True
  16. # s2

反射当前py文件的函数

3. 导入其他模块,利用反射查找该模块是否存在某个方法

  1. module_test.py
  2.  
  3. #!/usr/bin/python3
  4. # -*- coding: utf-8 -*-
  5. # Author: hkey
  6.  
  7. def test():
  8.         print('form the test.')
  9.  
  10. test1.py
  11.  
  12. '''
  13. 程序目录:
  14. module_test.py
  15. test1.py
  16.  
  17. 当前文件:
  18. test1.py
  19. '''
  20.  
  21. import module_test as obj
  22.  
  23. if hasattr(obj, 'test'):
  24.         func = getattr(obj, 'test')
  25.         func()
  26.  
  27. # 执行结果:
  28. # form the test.

利用反射导入另一个文件的函数及方法

item 系列

关键方法:

__getitem__:如果在类中定义了__getitem__()方法,那么就可以通过dict的形式,P[key]取值,当实例对象作P[key]运算时,就会调用类中的__getitem__()方法;

  1. class Student(object):
  2.         def __init__(self, name):
  3.                 self.name = name
  4.  
  5.         def __getitem__(self, item):
  6.                 print(self.__dict__[item])
  7.  
  8. s = Student('hkey')
  9. s.age = 20
  10. s['name']
  11. s['age']
  12. # 执行结果:
  13. # hkey
  14. #

__getitem__演示代码

__setitem__:如果在类中定义了__setitem__()方法,那么就可以通过dict的形式添加属性和方法;

  1. class Student(object):
  2.         def __init__(self, name):
  3.                 self.name = name
  4.  
  5.         def __setitem__(self, key, value):
  6.                 self.__dict__[key] = value
  7.  
  8.         def __getitem__(self, item):
  9.                 print(self.__dict__[item])
  10.  
  11. s = Student('hkey')
  12. # 调用类的__setitem__方法,通过dict的形式进行添加对象的属性
  13. s['age'] = 20
  14. s['hobby'] = 'coding'
  15.  
  16. # 调用类的__getitem__方法,通过dict的形式获取对象的属性
  17. s['age']
  18. s['hobby']
  19.  
  20. # 执行结果:
  21. #

__setitem__演示代码

__delitem__:通过dict的形式,删除对象的属性或方法

  1. class Student(object):
  2.         def __init__(self, name):
  3.                 self.name = name
  4.  
  5.         def __getitem__(self, item):
  6.                 return self.__dict__[item]
  7.  
  8.         def __delitem__(self, key):
  9.                 self.__dict__.pop(key)
  10.                 print('执行我了。')
  11.  
  12. s = Student('hkey')
  13. s.age = 20
  14. print(s['name'])
  15. print(s['age'])
  16. del s['age']
  17.  
  18. # 执行结果:
  19. # hkey
  20. #
  21. # 执行我了。

__delitem__演示代码

[ python ] 反射及item系列的更多相关文章

  1. 面向对象 反射 和item系列和内置函数和__getattr__和__setattr__

    反射 反射主要用在网络编程中, python面向对象的反射:通过字符串的形式操作对象相关的属性.python的一切事物都是对象. 反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函 ...

  2. day7--面向对象进阶(内含反射和item系列)

    一面向对象的结构和成员 1.1面向对象的结构 class A: company_name = '老男孩教育' # 静态变量(静态字段) __iphone = '1353333xxxx' # 私有静态变 ...

  3. python面向对象( item系列,__enter__ 和__exit__,__call__方法,元类)

    python面向对象进阶(下)   item系列 __slots__方法 __next__ 和 __iter__实现迭代器  析构函数 上下文管理协议 元类一.item系列 把对象操作属性模拟成字典的 ...

  4. python 全栈开发,Day24(复习,__str__和__repr__,__format__,__call__,__eq__,__del__,__new__,item系列)

    反射: 使用字符串数据类型的变量名来使用变量 wwwh即what,where,why,how  这4点是一种学习方法 反射 :使用字符串数据类型的变量名来使用变量 1.文件中存储的都是字符串 2.网络 ...

  5. Python概念-Item系列(林海峰教的)

    这个Item系列是egon老师自创的,个人还是可以接受这种文化底蕴的,所以直接拿来用,也是毫无违和感的 所谓Attr系列,其实是__setattr__,__delattr__,__getattr__ ...

  6. python 反射和内置方法

    一.isinstance和issubclass class Foo: pass class Son(Foo): pass s = Son() #判断一个对象是不是这个类的对象,传两个参数(对象,类) ...

  7. Python反射和内置方法(双下方法)

    Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...

  8. 1、__del__ 2、item系列 3、__hash__ 4、__eq__

    1.__del__   析构方法       释放一个空间之前之前 垃圾回收机制   2.item系列   和对象使用[ ]访问值有联系 __getitem__ __setitem__ __delit ...

  9. __del__,item系列 ,hash方法,__eq__,

    # 构造方法 申请一个空间# 析构方法 释放一个空间 # 某个对象借用了操作系统的资源,还要通过析构方法归还回去:文件资源 网络资源 # 垃圾回收机制 class A: def __del__(sel ...

随机推荐

  1. AtCoder Regular Contest 103 题解

    C-/\/\/\ #include<algorithm> #include<iostream> #include<cstdlib> #include<ioma ...

  2. 2018牛客多校第六场 G.Pikachu

    题意: 给出一棵n个点的树,每条边有边权.对这个树加边变成一个完全图.新加的边的权值为边上两点在树上的距离.求完全图上任意两点的最大流之和. 题解: 一共有C(n,2)个点对.假设当前求s到t之间的最 ...

  3. HDU4757:Tree——题解

    http://acm.hdu.edu.cn/showproblem.php?pid=4757 给一棵有点值的树,每次询问u~v的最短路当中的一个点的点权异或z最大值. 前置技能:HDU4825 前置技 ...

  4. jsp电子商务系统之六 订单篇1

    常规一个商品一个订单 多个商品一个订单 订单只有提交才能结算 付款页面 代码实现,主要是Servlet代码和Service业务层的代码,此处业务层,对多个dao的操作更为明显,体现业务二字!!! pa ...

  5. JavaScript对iframe的DOM操作

    在IE6.IE7中,我们可以使用 document.frames[ID].document 来访问iframe子窗口中的document对象,可是这是不符合W3C标准的写法,也是IE下独有的方法,在F ...

  6. bzo4802 欧拉函数 miller_rabin pollard_rho

    欧拉函数 Time Limit: 5 Sec  Memory Limit: 256 MBSubmit: 1112  Solved: 418[Submit][Status][Discuss] Descr ...

  7. mysql concat update中拼接字符串

    mysql> select id,avatar from tf_user; +----+--------------+ | id | avatar | +----+--------------+ ...

  8. PIP 批量更新改为清华这边的镜像更新

    之前pip批量更新的时候发现有些包无法更新,而且速度也特别慢,今天尝试了下清华的镜像,速度是真快 # coding=utf-8import pipfrom subprocess import call ...

  9. 2015/8/30 Python基础(4):序列操作符

    序列是指成员有序排列,可以通过下标偏移量访问的类型.Python序列包括:字符串.列表和元组.序列的每个元素可以指定一个偏移量得到,多个元素是通过切片操作得到的.下标偏移量从0开始计数到总数-1结束. ...

  10. MyBatis框架的使用及源码分析(一) 配置与使用

    我们先来看一个例子,简单的了解一下mybatis的mapper接口方式的使用. package org.mybatis.spring.sample; import org.apache.ibatis. ...