python学习之反射

python学习反射

实例1

脚本内容如下:


#coding: utf8

class myClass(object):

def fax(self):

print ‘faxing....‘

def copy(self):

print ‘copying...‘

def printing():

print ‘printing....‘

m = myClass()

if hasattr(m,‘fax‘):          #判断myClass类中是否有fax方法

func = getattr(m,‘fax‘)    #返回内存对象

func()                #调用

setattr(m,‘print2‘,printing)

m.print2()

try:

#delattr(m,‘copy‘)

#print name

#print dfdf

#print tttt

print m

except AttributeError,e:

print ‘something wrong..‘,e

except Exception,e:

print e

finally:

print ‘-----------‘

#else:

#    print "print nothing wrong ...."

执行脚本结果如下:

faxing....

printing....

<__main__.myClass object at 0x028211D0>

-----------

实例2

脚本内容如下:


#/usr/bin/env python

#coding: utf8

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()

if __name__ == "__main__":

server = WebServer(‘localhost‘,80)

#print sys.argv[1]

cmd_dic = {

‘start‘:server.start,

‘stop‘:server.stop,

‘restart‘:server.restart,

}

#if sys.argv[1] == ‘start‘:

if sys.argv[1] in cmd_dic:

cmd_dic[sys.argv[1]]()

执行脚本结果如下:

D:\Python学习\脚本学习>python 反射01.py start

Server is starting...

修改上面的脚本如下:


#/usr/bin/env python

#coding: utf8

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()

if __name__ == "__main__":

server = WebServer(‘localhost‘,80)

if hasattr(server,sys.argv[1]):

func = getattr(server,sys.argv[1])   ##获取server.start的内存地址

func()     ##相当于server.start()

执行脚本结果如下:

D:\Python学习\脚本学习>python 反射02.py start

Server is starting...

D:\Python学习\脚本学习>python 反射02.py stop

Server is stopping...


修改上面的脚本如下:


#/usr/bin/env python

#coding: utf8

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‘,80)

if hasattr(server,sys.argv[1]):

func = getattr(server,sys.argv[1])   ##获取server.start的内存地址

func()     ##相当于server.start()

setattr(server,‘run‘,test_run)  ##test_run以run身份绑定到server实例中

server.run(‘peng‘)       ##类似执行test_run(‘peng‘)

执行脚本结果如下:

D:\Python学习\脚本学习>python 反射03.py start

Server is starting...

running... peng


修改上面的脚本如下:


#/usr/bin/env python

#coding: utf8

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(self,name):

print "running...",name,self.host

if __name__ == "__main__":

server = WebServer(‘localhost‘,80)

if hasattr(server,sys.argv[1]):

func = getattr(server,sys.argv[1])   ##获取server.start的内存地址

func()     ##相当于server.start()

setattr(server,‘run‘,test_run)  ##test_run以run身份绑定到server实例中

server.run(server,‘peng‘)       ##类似执行test_run(‘peng‘)

执行脚本结果如下:

D:\Python学习\脚本学习>python 反射04.py start

Server is starting...

running... peng localhost


修改上面的脚本如下:


#/usr/bin/env python

#coding: utf8

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(self,name):

print "running...",name,self.host

if __name__ == "__main__":

server = WebServer(‘localhost‘,80)

if hasattr(server,sys.argv[1]):

func = getattr(server,sys.argv[1])   ##获取server.start的内存地址

func()     ##相当于server.start()

delattr(WebServer,‘start‘)

print server.restart()

#setattr(server,‘run‘,test_run)  ##test_run以run身份绑定到server实例中

#server.run(server,‘peng‘)       ##类似执行test_run(‘peng‘)

执行脚本结果如下:

D:\Python学习\脚本学习>python 反射05.py restart

Server is stopping...    ---》执行的是func()的调用

Server is starting...    ---》执行的是func()的调用

Server is stopping...    ---》执行的是server.restart()的调用

Traceback (most recent call last):

File "反射05.py", line 31, in <module>

print server.restart()

File "反射05.py", line 19, in restart

self.start()

AttributeError: ‘WebServer‘ object has no attribute ‘start‘ ---》执行的是server.restart()的调用,此时start已经删除,所以报了“‘WebServer‘ object has no attribute ‘start‘”错误!!!

时间: 2024-10-05 22:27:41

python学习之反射的相关文章

Python 学习笔记 - 反射

Python里面反射指的是可以通过字符串在对象里面(比如一个模块)去操作(查找,删除,判断)一个成员(比如这个模块里面的函数). 比如目前所学的知识,我们需要在模块s1.py中调用一个函数f1,我们需要导入s1.py,然后才能执行f1() import s1 s1.f1() 如果一个大型软件有几百上千个函数需要调用,那么这样写起来会很累.一个简单的方法是反射. 比如一个简单的例子,从index里面调用commons commons.py #!/usr/bin/env python # -*- c

Python学习【反射机制】

反射机制 反射机制的本质是以字符串形式在对象或模块中进行添加,查找,删除,获取成员等操作,是一种基于字符串的一系列事件驱动. 相关内置函数 getattr(object, name[, default]) 获取object对象中的name属性并返回其值,在name不存在时返回default,不设置则会抛出一个AttributeError. setattr(object, name, value) 设置object对象中name属性的值为value,name不存在时则创建属性并赋值. hasatt

python学习------------异常以及反射

学完这一节,python基础部分就要告一段落了,期待进入新一阶段的学习,也给自己说坚持就是胜利. 一.isinstance(obj,cls) 检查obj是否是cls的对象 1.首先从学过的变量开始 a = 12 b = "bb" print isinstance(a,int) #结果是True print isinstance(a,str) #结果是False print isinstance(b,str) #结果是True print isinstance(b,int) #结果是Fa

Python学习记录day6

Python学习记录day6 学习 python Python学习记录day6 1.反射 2.常用模块 2.1 sys 2.2 os 2.3 hashlib 2.3 re 1.反射 反射:利用字符串的形式去对象(默认)中操作(寻找)成员 cat commons.py #!/usr/bin/env python#_*_coding:utf-8_*_''' * Created on 2016/12/3 21:54. * @author: Chinge_Yang.''' def login(): pr

Python学习记录day3

Python学习记录 day3 今天是银角大王武sir讲课.先回顾了上节课所学,然后讲到了面向对象思想. set set是一个无序且不重复,可嵌套的元素集合 class set(object):     """     set() -> new empty set object     set(iterable) -> new set object     Build an unordered collection of unique elements.     

Python学习—面向对象学习下

面向对象下 1.构造方法与析构方法 class People(object): # 构造方法:__init__(),在实例化对象时自动执行的方法 def __init__(self, name, age): self.name = name self.age = age print("创建对象成功.......") # 析构函数:__del__(), 当你删除对象时,自动调用的方法 # 删除对象:del 对象名 def __del__(self): print("删除对象成功

python学习:程序控制结构·作业20141219

Python学习:程序控制结构 20141219 编程环境: windows 7 x64 python 2.7.6 题目: 1 编写程序,完成下列题目(1分) 题目内容: 如果列出10以内自然数中3或5的倍数,则包括3,5,6,9.那么这些数字的和为23.要求计算得出任意正整数n以内中3或5的倍数的自然数之和. 输入格式: 一个正整数n. 输出格式: n以内中3或5的倍数的自然数之和. 输入样例: 10 输出样例: 23 时间限制:500ms内存限制:32000kb n = int(raw_in

python学习第二天

python学习的第二天就是个灾难啊,这天被打击了,自己写的作业被否认了,不说了,写博客还是个好习惯的,要坚持下去,就不知道能坚持到什么时候.呵呵!!! 这天教的知识和第一天的知识相差不大,区别在于比第一天讲的更细了(我们是两个老师教的,风格是不一样的),这次也写那些比较细的知识点. python的简介 (1)你的程序一定要有个主文件. (2)对于python,一切事物都是对象,对象基于类创建.#似懂非懂,不过有那么点似懂. 知识点 #__divmod__ 会把两个数字相除的商和余数以元组的方式

[Python 学习] 二、在Linux平台上使用Python

这一节,主要介绍在Linux平台上如何使用Python 1. Python安装. 现在大部分的发行版本都是自带Python的,所以可以不用安装.如果要安装的话,可以使用对应的系统安装指令. Fedora系统:先以root登入,运行 yum install python Ubuntu系统:在root组的用户, 运行 sudo apt-get install python 2. 使用的Python的脚本 Linux是一个以文件为单位的系统,那么我们使用的Python是哪一个文件呢? 这个可以通过指令