python中key的item是什么_[ python ] 反射及item系列

反射

什么是反射?

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

关键方法:

(1)getattr:获取属性

(2)setattr:设置属性

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

(4)delattr:删除属性

具体功能演示:

ContractedBlock.gif

ExpandedBlockStart.gif

classFoo:

f= '类对静态变量'def __init__(self, name, age):

self.name=name

self.age=agedefsay_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') #删除不存在对属性,会报错

实例中的用法:importosclassManage_cmd(object):defrun(self):whileTrue:

cmd= input('>>>').strip()if not cmd: continueifhasattr(self, cmd):

func=getattr(self, cmd)

func()else:print('-bash: %s: command not found' %cmd)defls(self):print(os.listdir('.'))

cmd=Manage_cmd()

cmd.run()#执行结果:#>>>ls#['test1.py']#>>>asdfadf#-bash: asdfadf: command not found

反射功能演示代码

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

ContractedBlock.gif

ExpandedBlockStart.gif

classFoo(object):

staticField= 'hello world.'def __init__(self):

self.name= 'hkey'deftest(self):return 'test'@staticmethoddefbar():return 'bar'

print(getattr(Foo, 'staticField'))print(getattr(Foo, 'test'))

func= getattr(Foo, 'bar')print(func())#执行结果:#hello world.##bar

反射类的方法

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

ContractedBlock.gif

ExpandedBlockStart.gif

importsysdefs1():print('s1')defs2():print('s2')

this_module= sys.modules[__name__]print(hasattr(this_module, 's1'))

func= getattr(this_module, 's2')

func()#执行结果:#True#s2

反射当前py文件的函数

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

ContractedBlock.gif

ExpandedBlockStart.gif

module_test.py#!/usr/bin/python3#-*- coding: utf-8 -*-#Author: hkey

deftest():print('form the test.')

test1.py'''程序目录:

module_test.py

test1.py

当前文件:

test1.py'''

importmodule_test as objif hasattr(obj, 'test'):

func= getattr(obj, 'test')

func()#执行结果:#form the test.

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

item 系列

关键方法:

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

ContractedBlock.gif

ExpandedBlockStart.gif

classStudent(object):def __init__(self, name):

self.name=namedef __getitem__(self, item):print(self.__dict__[item])

s= Student('hkey')

s.age= 20s['name']

s['age']#执行结果:#hkey#20

__getitem__演示代码

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

ContractedBlock.gif

ExpandedBlockStart.gif

classStudent(object):def __init__(self, name):

self.name=namedef __setitem__(self, key, value):

self.__dict__[key] =valuedef __getitem__(self, item):print(self.__dict__[item])

s= Student('hkey')#调用类的__setitem__方法,通过dict的形式进行添加对象的属性

s['age'] = 20s['hobby'] = 'coding'

#调用类的__getitem__方法,通过dict的形式获取对象的属性

s['age']

s['hobby']#执行结果:#20

__setitem__演示代码

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

ContractedBlock.gif

ExpandedBlockStart.gif

classStudent(object):def __init__(self, name):

self.name=namedef __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#20#执行我了。

__delitem__演示代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值