python反射及其attr系列案例

 1 class People:
 2     """
 3  hasattr,setattr,getattr,delattr原理:所有的对象或者类如果有设定相应的key,value,那么在对应的__dict__
 4     这个返回值中都有key,value存在的,
 5
 6     """
 7     def __init__(self,name):
 8         self.name = name
 9     def walk(self):
10         print(‘%s 瞧,\‘piter\‘ 正在奔跑‘% self.name)
11 P1 = People(‘lucy‘)
12 if hasattr(P1,‘name‘):  #判定如果调用对象P1有name属性,返回True,否则返回False
13     print(P1.__dict__[‘name‘]) #lucy
14
15 if hasattr(P1,‘age‘):
16     print(P1.__dict__[‘age‘])
17 else:
18     setattr(P1,‘age‘,18)
19     print(P1.__dict__) #{‘age‘: 18, ‘name‘: ‘lucy‘}
20 if hasattr(P1,‘age‘):
21     delattr(P1,‘age‘)  #删除age属性
22 print(P1.__dict__) #{‘name‘: ‘lucy‘}

反射之四大内置函数

#下面是一个菜单的案例,类似反射(反射本质就是把字符串转成对象

 1 def search():
 2     print(‘print search content‘)
 3 def add():
 4     print(‘add content‘)
 5 def delete():
 6     print(‘delete‘)
 7 def modify():
 8     print(‘modify‘)
 9 cmd_dict = {‘search‘:search,‘add‘:add,‘delete‘:delete,‘modify‘:modify}
10 while True:
11     count = 0
12     for i in cmd_dict.keys():
13         count += 1
14         print("%s\t%s"%(count,i))
15     opt = input("请输入选项>>> ")
16     if not opt:continue
17     if opt in cmd_dict:
18         func = cmd_dict.get(opt)
19         func()

菜单案例

内置attr:__getattr__,__setattr__,__delattr__

 1 class Foo:
 2     def __init__(self,name):
 3         self.name = name
 4
 5     def __getattr__(self, item):  #当属性不存在的情况下才会执行,否则不执行
 6         """如果被调用属性存在就不执行这里定义的代码块,否则的话,会执行这里的代码块"""
 7         print(‘get------%s‘%item,type(item))
 8
 9     def __setattr__(self,key,value):
10         """设置值,实际上是往调用对象那个__dict__里设定key,并给相应的value"""
11         if not isinstance(value,str):raise  TypeError("must be str")
12         self.__dict__[key] = value
13         print(‘set ----Key:%s,value:%s‘%(key,value),type(key),type(value))
14     def __delattr__(self, item):
15         """删除属性,实际上是把调用对象的__dict__里删除指定的key"""
16         self.__dict__.pop(item)
17         print(‘delete item:%s‘%item,type(item))
18
19 F = Foo(‘lucy‘)
20 print(F.__dict__)
21 print(F.name)
22 F.age = ‘100‘
23 del F.age
24 print(F.__dict__)
25 F.age = ‘1002‘
26 print(F.age)

反射内置attr应用

 

 1 cmd_dict = {‘search‘:search,‘add‘:add,‘delete‘:delete,‘modify‘:modify}
 2 while True:
 3     count = 0
 4     for i in cmd_dict.keys():
 5         count += 1
 6         print("%s\t%s"%(count,i))
 7     opt = input("请输入选项>>> ")
 8     if not opt:continue
 9     if opt in cmd_dict:
10         func = cmd_dict.get(opt)
11         func()

菜单案例


				
时间: 2024-12-26 08:19:09

python反射及其attr系列案例的相关文章

Python概念-Attr系列(林海峰教的)

这个Attr系列是egon老师自创的,个人还是可以接受这种文化底蕴的,所以直接拿来用,也是毫无违和感的 所谓Attr系列,其实是__setattr__,__delattr__,__getattr__ 三个函数,从名字中可以看出来这是一套设置,删除,查询的函数,那我们来一个一个的看: __setattr__(self):当对类中的某个属性进行"赋值"时触发的函数 代码示例: 1 class Teacher: 2 def __init__(self): 3 self.name = &quo

Python 反射机制详解

本文和大家分享的主要是python反射机制相关内容,一起来看看吧,希望对大家学习python有所帮助. 对编程语言比较熟悉的朋友,应该知道"反射"这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述python的反射机制的使用场景和核心本质. 一.前言 1 def f1():2   print("f1是这个函数的名字!")3   4 s = "f1"

attr系列

#__setattr__ 赋值方法,即一旦遇到self.name=name,就会执行__setattr__方法#__delattr__ 删除方法,一旦遇到del self.name,就会执行__delattr__方法#__getattr__ 查询方法,一旦遇到res=self.name,取res的值,且self.name不存在时,#就会执行__getattr__方法.它与__setattr__和__delattr__不同.#attr系列与property的区别,#1.attr系列是定义在类中的函

Python猫荐书系列之五:Python高性能编程

稍微关心编程语言的使用趋势的人都知道,最近几年,国内最火的两种语言非 Python 与 Go 莫属,于是,隔三差五就会有人问:这两种语言谁更厉害/好找工作/高工资-- 对于编程语言的争论,就是猿界的生理周期,每个月都要闹上一回.到了年末,各类榜单也是特别抓人眼球,闹得更凶. 其实,它们各有对方所无法比拟的优势以及用武之地,很多争论都是没有必要的.身为一个正在努力学习 Python 的(准)中年程序员,我觉得吧,先把一门语言精进了再说.没有差劲的语言,只有差劲的程序员,等真的把语言学好了,必定是"

python 反射 动态导入模块 类attr属性

1.反射 hasattr getattr delattr setattr 优点:事先定义好接口,接口只有在被完成后才能真正执行,这实现了即插即用,这其实是一种“后期绑定”,即先定义好接口, 然后是再去实现具体的功能 print(hasattr(p, 'age')) # True 是否有属性 判断 print(getattr(p, 'name', '没有找到该参数')) # get属性值 print(getattr(p, 'name1', 'False')) # False setattr(p,

python 反射

1. 反射 实例:伪造web框架中的路由系统 利用反射导入模块 obj = __import__('commons') obj = __import__('lib.' + 'commons',fromlist = True) 导入模块不在当前目录下,需要设置fromlist参数为真, 才能拼接模块路径 利用反射操作对象成员(属性) 通过传入字符串,操作(检查/获取/删除/设置)对象成员(属性) hasattr(对象名,字符串),如果对象中存在名为字符串的属性(成员),返回True,否则返回Fal

Python反射

反射的定义 根据字符串的形式去某个对象中操作成员 根据字符串的形式去一个对象中寻找成员 根据字符串的形式去一个对象中设置成员 根据字符串的形式去一个对象中删除成员 根据字符串的形式去一个对象中判断成员是否存在 初始反射 通过字符串的形式,导入模块 根据用户输入的模块名称,导入对应的模块并执行模块中的方法 # Python使用的是3.5.1 [[email protected] ~]# python -V Python 3.5.1 # commons.py为模块文件 [[email protect

Android自定义控件系列案例【四】

案例效果: 模拟器上运行有些锯齿,真机上和预期一样好 案例分析: 看效果,第一直觉肯定是Android原生态控件中没有这样的控件实现这种效果,自然想到应该需要自定义控件了,没错,这就是通过自定义控件来绘制的一个圆环进度条.仔细分析发现这个效果的进度条应该由几个部分组成,首先是无进度时的浅色圆环,然后是一个随进度变化的深色圆弧,而中间部分是一个深蓝色的实心圆,最后就是显示进度百分比的文字.这几部分大部分都是图形,所以使用图形绘制技术应该可以绘制出分部分效果,然后加上进度控制部分应该心里就有底了.

python 多线程糗事百科案例

案例要求参考上一个糗事百科单进程案例 Queue(队列对象) Queue是python中的标准库,可以直接import Queue引用;队列是线程间最常用的交换数据的形式 python下多线程的思考 对于资源,加锁是个重要的环节.因为python原生的list,dict等,都是not thread safe的.而Queue,是线程安全的,因此在满足使用条件下,建议使用队列 初始化: class Queue.Queue(maxsize) FIFO 先进先出 包中的常用方法: Queue.qsize