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 ...
随机推荐
- 【转】linux代码段,数据段,BSS段, 堆,栈
转载自 http://blog.csdn.net/wudebao5220150/article/details/12947445 linux代码段,数据段,BSS段, 堆,栈 网上摘抄了一些,自己组 ...
- Spark SQL应用
Spark Shell启动后,就可以用Spark SQL API执行数据分析查询. 在第一个示例中,我们将从文本文件中加载用户数据并从数据集中创建一个DataFrame对象.然后运行DataFrame ...
- 转载 C#使用Salt + Hash来为密码加密
转载 http://www.csharpwin.com/csharpspace/13412r9615.shtml (一) 为什么要用哈希函数来加密密码 如果你需要保存密码(比如网站用户的密码),你要考 ...
- Codeforces Round #352 (Div. 2) D. Robin Hood (二分答案)
题目链接:http://codeforces.com/contest/672/problem/D 有n个人,k个操作,每个人有a[i]个物品,每次操作把最富的人那里拿一个物品给最穷的人,问你最后贫富差 ...
- Unity3D之Mecanim动画系统学习笔记(二):模型导入
我们要在Unity3D中使用上模型和动画,需要经过下面几个阶段的制作,下面以一个人形的模型开发为准来介绍. 模型制作 模型建模(Modelling) 我们的美术在建模时一般会制作一个称为T-Pose( ...
- Table 样式设置
http://www.gzsums.edu.cn/webclass/html/table.html
- get_template_part() 函数详解备忘(转)
最近研究官方主题 Twenty Eleven ,有一些东西网上现成的中文资料不好找,在博客里记载下来,算是分享,也算是备忘,wordpress 3.0 以后就开始便有了get_template_par ...
- SQL Server 数据类型映射 (ADO.NET)
SQL Server 数据类型映射 (ADO.NET) .NET Framework 3.5 更新:November 2007 SQL Server 和 .NET Framework 基于不同的类型系 ...
- GitHub-撤销commit
以下方法适用于:撤销最后一次提交的情况 步骤如下: 步骤1.使用 ”git log“ 命令 找到 想要撤销的操作之前的一次提交的commit id : 比如:使用 git log命令如下结果 comm ...
- 通过lldb远程调试iOS App
苹果从Xcode5开始弃用了gcc及gdb, 只能使用llvm用lldb. 在越狱机上虽然仍然可以使用gdb进行调试,但lldb是趋势.下面就介绍一种通过Wifi或者USB,在Mac上使用lldb对i ...