python(7)– 类的反射
python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。
import sys class WebServer(object):
def __init__(self, host, port):
self.host = host
self.port = port def start(self):
print("Server is starting....") def stop(self):
print("Server is stopping....") def restart(self):
self.stop()
self.start() #在类外面定义一个函数
def test_run(name):
print("running...", name) if __name__ == "__main__":
server = WebServer("localhost", 22)
server1 = WebServer('localhost', 22)
setattr(server, 'name', 'website') #设置实例,该实例就有了name属性
setattr(server, "run", test_run) #将类外面的函数与类实例绑定在一起
if hasattr(server, sys.argv[1]): #检测类里是否有这个方法,sys.argv[1]是指第一个参数就是命令后面跟的类似service start的start
fun = getattr(server, sys.argv[1]) #获取实例方法的内存地址,即server.start
fun() #执行方法
#server1.run('web1') #test_run与实例server绑定在一起,server1中是没有的,这里会报错 #删除start方法
delattr(WebServer, 'start') #注意这里删除的是类的方法,如果删除某实例中的方法,则其它实例中还可以执行
#server1.start() #start方法已经被删除,这里会报错
server.start() #删除之后所有的实例都不能执行start方法了
===========以下内容为转载=====================
#文/大明白(简书作者)
#原文链接:http://www.jianshu.com/p/b937f346dd4a
#著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
#Python中有一个有趣的语法,只要定义类型的时候,实现call函数,
#这个类型就成为可调用的。换句话说,我们可以把这个类的对象当作函数来使用,
#相当于重载了括号运算符。setattr, getattr, delattr为操作对象属性的调用
#Python中有一个有趣的语法,只要定义类型的时候,实现call函数,
#这个类型就成为可调用的。换句话说,我们可以把这个类的对象当作函数来使用,
#相当于重载了括号运算符。setattr, getattr, delattr为操作对象属性的调用
class storage(dict):
#通过使用__setattr__, __getattr__, __delattr__
#可以重写dict,使之通过“.”调用
def __setattr__(self, key, value):
self[key] = value
def __getattr__(self, key):
try:
return self[key]
except KeyError as k:
return None
def __delattr__(self, key):
try:
del self[key]
except KeyError as k:
return None # __call__方法用于实例自身的调用
#达到()调用的效果
def __call__(self, key):
try:
return self[key]
except KeyError as k:
return None s = storage()
s.name = "hello" #这是__setattr__起的作用
print(s("name")) #这是__call__起的作用
print(s["name"]) #dict默认行为
print(s.name) #这是__getattr__起的作用
del s.name #这是__delattr__起的作用
#print(s("name"))
#print(s["name"])
#print(s.name) #可以定义任意的key
s.job = 'IT'
s.age = 123
print(s.job, s.age)
python(7)– 类的反射的更多相关文章
- python基础-类的反射
1)反射是通过字符串方式映射内存中的对象. python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr, 改四个函数分别用于对对象内部执行:检查是 ...
- 【python】-- 类的反射
反射 反射我们以后会经常用到,这个东西实现了动态的装配,通过字符串来反射类中的属性和方法 一.反射函数 1.hasarttr(obj,name_str) 作用:判断一个对象obj中是否有对应的name ...
- 从C#到Python —— 4 类及面向对象
http://www.cnblogs.com/yanxy/archive/2010/04/04/c2p_4.html 如果你熟悉C#,那么对类(Class)和面向对象(Object Oriented) ...
- 类的反射_reflex
JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为j ...
- python 面向对象编程 之 反射
1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...
- Python开发基础-Day22反射、面向对象进阶
isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象,如果是返回True class Foo ...
- Python之面向对象之反射、内置方法
一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...
- Python笔记——类定义
Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...
- 【python】类中的self
在python的类中,经常会写self,代表对象自己.如下例: #coding=utf-8 class Foo: def __init__(self, name): self.name = name ...
随机推荐
- Fast Intro To Java Programming (1)
基本语法 编写Java程序时,应注意以下几点: 大小写敏感:Java是大小写敏感的,这就意味着标识符Hello与hello是不同的. 类名:对于所有的类来说,类名的首字母应该大写.如果类名由若干单词组 ...
- Codevs No.2144 砝码称重2
2016-05-31 22:01:16 题目链接: 砝码称重2 (Codevs No.2144) 题目大意: 给定N个砝码,求称出M的重量所需砝码最小个数 解法: 贪心 使砝码数量最小,当然是每个砝码 ...
- MSSql得到表的结构和字段
得到数据库中所有的表 select name from sysobjects where xtype='u' and name='{0}' 1.获取表的基本字段属性 --获取SqlServer中表结构 ...
- 能够提高开发效率的 Eclipse 实用操作
工欲善其事,必先利其器.对于程序员来说,Eclipse便是其中的一个“器”.本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍.Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分 ...
- 【转】Nginx系列(四)--工作原理
原博文出于: http://blog.csdn.net/liutengteng130/article/details/46724081 感谢! 上篇文章介绍了Nginx框架的设计之管理进程以及 ...
- Struts2通配符映射
1.一个Web 应用可能有成百上千个 action 声明. 可以利用 struts 提供的通配符映射机制把多个彼此相似的映射关系简化为一个映射关系 2.通配符映射规则 –若找到多个匹配, 没有通配符的 ...
- iOS事件机制(二)
从上一篇的内容我们知道,在iOS中一个事件用一个UIEvent对象表示,UITouch用来表示一次对屏幕的操作动作,由多个UITouch对象构成了一个UIEvent对象.另外,UIResponder是 ...
- Unity3D中关于场景销毁时事件调用顺序的一点记录
先说一下我遇到的问题,我弄了一个对象池管理多个对象,对象池绑定在一个GameObject上,每个对象在OnBecameInvisible时会进行回收(即移出屏幕就回收),但是当场景切换或停止运行程序时 ...
- 五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT) – 整理
当Adobe.Microsoft.Sun等一系列巨头开始表现出对”开源”的青睐时,”开源”的时代即将到来! 最初来自:sinoprise.com/read.php?tid-662-page-e-fpa ...
- Date、String、Calendar、Timestamp类型之间的转化
1.Calendar 转化 String Calendar calendat = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDa ...