[ python ] 反射及item系列
反射
什么是反射?
通过字符串的形式操作对象相关属性。python中的事物都是对象;
关键方法:
(1)getattr:获取属性
(2)setattr:设置属性
(3)hashattr:检测是否含有属性,返回布尔值
(4)delattr:删除属性
具体功能演示:
class Foo:
f = '类对静态变量'
def __init__(self, name, age):
self.name = name
self.age = age def say_hi(self):
print('hi, %s' % self.name) obj = Foo('xiaofei', 20) # 检测是否含有某属性
print(hasattr(obj, 'name'))
print(hasattr(obj, 'say_hi'))
# 执行结果:
# True
# True print('--------------------------------------') # 获取属性:
print(getattr(obj, 'name'))
func = getattr(obj, 'say_hi')
func()
print(getattr(obj, 'aaaaa', '不存在!')) # 执行结果:
# xiaofei
# hi, xiaofei
# 不存在! print('--------------------------------------') # 设置属性 setattr(obj, 'gender', 'female')
setattr(obj, 'show_name', lambda self: self.name + 'er')
print(obj.gender)
print(obj.show_name(obj)) # 执行结果:
# female
# xiaofeier print('--------------------------------------') # 删除属性
delattr(obj, 'age')
delattr(obj, 'show_name')
print(obj.__dict__)
# 执行结果:
# {'gender': 'female', 'name': 'xiaofei'} delattr(obj, 'aaaa') # 删除不存在对属性,会报错 实例中的用法: import os
class Manage_cmd(object):
def run(self):
while True:
cmd = input('>>>').strip()
if not cmd: continue
if hasattr(self, cmd):
func = getattr(self, cmd)
func()
else:
print('-bash: %s: command not found' % cmd) def ls(self):
print(os.listdir('.')) cmd = Manage_cmd()
cmd.run() # 执行结果:
# >>>ls
# ['test1.py']
# >>>asdfadf
# -bash: asdfadf: command not found
反射功能演示代码
1. 反射不仅仅只能用在属性上,也可以用在方法上
class Foo(object):
staticField = 'hello world.' def __init__(self):
self.name = 'hkey' def test(self):
return 'test' @staticmethod
def bar():
return 'bar' print(getattr(Foo, 'staticField'))
print(getattr(Foo, 'test'))
func = getattr(Foo, 'bar')
print(func()) # 执行结果:
# hello world.
# <function Foo.test at 0x00000141FE18D158>
# bar
反射类的方法
2. 反射当前文件(模块)成员
import sys def s1():
print('s1') def s2():
print('s2') this_module = sys.modules[__name__]
print(hasattr(this_module, 's1'))
func = getattr(this_module, 's2')
func() # 执行结果:
# True
# s2
反射当前py文件的函数
3. 导入其他模块,利用反射查找该模块是否存在某个方法
module_test.py #!/usr/bin/python3
# -*- coding: utf-8 -*-
# Author: hkey def test():
print('form the test.') test1.py '''
程序目录:
module_test.py
test1.py 当前文件:
test1.py
''' import module_test as obj if hasattr(obj, 'test'):
func = getattr(obj, 'test')
func() # 执行结果:
# form the test.
利用反射导入另一个文件的函数及方法
item 系列
关键方法:
__getitem__:如果在类中定义了__getitem__()方法,那么就可以通过dict的形式,P[key]取值,当实例对象作P[key]运算时,就会调用类中的__getitem__()方法;
class Student(object):
def __init__(self, name):
self.name = name def __getitem__(self, item):
print(self.__dict__[item]) s = Student('hkey')
s.age = 20
s['name']
s['age']
# 执行结果:
# hkey
#
__getitem__演示代码
__setitem__:如果在类中定义了__setitem__()方法,那么就可以通过dict的形式添加属性和方法;
class Student(object):
def __init__(self, name):
self.name = name def __setitem__(self, key, value):
self.__dict__[key] = value def __getitem__(self, item):
print(self.__dict__[item]) s = Student('hkey')
# 调用类的__setitem__方法,通过dict的形式进行添加对象的属性
s['age'] = 20
s['hobby'] = 'coding' # 调用类的__getitem__方法,通过dict的形式获取对象的属性
s['age']
s['hobby'] # 执行结果:
#
__setitem__演示代码
__delitem__:通过dict的形式,删除对象的属性或方法
class Student(object):
def __init__(self, name):
self.name = name def __getitem__(self, item):
return self.__dict__[item] def __delitem__(self, key):
self.__dict__.pop(key)
print('执行我了。') s = Student('hkey')
s.age = 20
print(s['name'])
print(s['age'])
del s['age'] # 执行结果:
# hkey
#
# 执行我了。
__delitem__演示代码
[ python ] 反射及item系列的更多相关文章
- 面向对象 反射 和item系列和内置函数和__getattr__和__setattr__
反射 反射主要用在网络编程中, python面向对象的反射:通过字符串的形式操作对象相关的属性.python的一切事物都是对象. 反射就是通过字符串的形式,导入模块:通过字符串的形式,去模块寻找指定函 ...
- day7--面向对象进阶(内含反射和item系列)
一面向对象的结构和成员 1.1面向对象的结构 class A: company_name = '老男孩教育' # 静态变量(静态字段) __iphone = '1353333xxxx' # 私有静态变 ...
- python面向对象( item系列,__enter__ 和__exit__,__call__方法,元类)
python面向对象进阶(下) item系列 __slots__方法 __next__ 和 __iter__实现迭代器 析构函数 上下文管理协议 元类一.item系列 把对象操作属性模拟成字典的 ...
- python 全栈开发,Day24(复习,__str__和__repr__,__format__,__call__,__eq__,__del__,__new__,item系列)
反射: 使用字符串数据类型的变量名来使用变量 wwwh即what,where,why,how 这4点是一种学习方法 反射 :使用字符串数据类型的变量名来使用变量 1.文件中存储的都是字符串 2.网络 ...
- Python概念-Item系列(林海峰教的)
这个Item系列是egon老师自创的,个人还是可以接受这种文化底蕴的,所以直接拿来用,也是毫无违和感的 所谓Attr系列,其实是__setattr__,__delattr__,__getattr__ ...
- python 反射和内置方法
一.isinstance和issubclass class Foo: pass class Son(Foo): pass s = Son() #判断一个对象是不是这个类的对象,传两个参数(对象,类) ...
- Python反射和内置方法(双下方法)
Python反射和内置方法(双下方法) 一.反射 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发 ...
- 1、__del__ 2、item系列 3、__hash__ 4、__eq__
1.__del__ 析构方法 释放一个空间之前之前 垃圾回收机制 2.item系列 和对象使用[ ]访问值有联系 __getitem__ __setitem__ __delit ...
- __del__,item系列 ,hash方法,__eq__,
# 构造方法 申请一个空间# 析构方法 释放一个空间 # 某个对象借用了操作系统的资源,还要通过析构方法归还回去:文件资源 网络资源 # 垃圾回收机制 class A: def __del__(sel ...
随机推荐
- Linux相关——手写测试程序
由于本人太弱,,,不会lemon,,,也不会在ubuntu下安装lemon,所以我选择手写测试程序emmmm 首先要写这个东西我们要先知道对拍怎么写. ; i <= ; i++) { syste ...
- Android Service 生命周期
Service概念及用途: Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行 ...
- 【BZOJ4031】小Z的房间(矩阵树定理)
[BZOJ4031]小Z的房间(矩阵树定理) 题面 BZOJ 洛谷 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子 ...
- POJ2135:Farm Tour——题解
http://poj.org/problem?id=2135 题目大意: 从1到n再回来,每条边只能走一次,问最短路. —————————————————— 如果不告诉我是费用流打死不会想这个…… 我 ...
- HDU5115:Dire Wolf——题解+翻译
http://acm.hdu.edu.cn/showproblem.php?pid=5115 题目大意:给n匹狼,每一次攻击可以秒杀一匹狼,但同时会受到这匹狼的a攻击和它相邻两只狼的b攻击. 给定a, ...
- BZOJ4104 [Thu Summer Camp 2015]解密运算 【乱搞】
题目链接 BZOJ4104 题解 我们将已知字符排序,由循环就可以得到一个对应关系 如样例就是: 0->第5行 1->第1行 1->第2行 1->第3行 1->第5行 2 ...
- AOJ.667 抢占白房子
抢占白房子 点我挑战题目 考察点 字符串 Time Mem Len Lang 14ms 444 KB 0.75 K GCC 题意分析 数据仅有一组,根据题目,左上角的一个格子为白色,与白色相邻的(无论 ...
- POJ1742 Coins(男人八题之一)
前言 大名鼎鼎的男人八题,终于见识了... 题面 http://poj.org/problem?id=1742 分析 § 1 多重背包 这很显然是一个完全背包问题,考虑转移方程: DP[i][j]表示 ...
- ASP.Net初级学习一(基本语句入门)
<body > <form method="post" action="program.ashx"> <input type=&q ...
- ACM1811拓扑排序和并查集
/* ACM1811 可以利用拓扑排序和并查集解决,主要方式是利用并查集在输入数据的时候将所有相等的点合并 然后将处理完的数据统一按照一个符号方向连接成有向线段,利用的是邻接矩阵:接下来把每条边都进行 ...