Python:反射

所谓的反射就是这四个函数:
hasattr(p_object, name)
这个函数是一个布尔型,他的目的就是为了决定一个对象是否有一个特定的属性,一般用于访问某个属性前先做一下检查

getattr(object, name, default=None)
获取对象的属性,如果输方法就返回这个方法对应的地址,试图获取不存在的属性的时候会引发一个AttributeError异常

setattr(p_object, name, value)
给对象的属性进行赋值,可以设置一个方法,要么加入一个新属性,要么覆盖已经存在的属性

delattr(p_object, name)
从一个对象中删除属性
实现

#coding:utf-8

import sys
class Webserver(object):
    def __init__(self,host,port):
        self.host=host
        self.port=port

    def start(self):
        print "server is starting....",self.host

    def stop(self):
        print "server is stopping.....",self.host

    def restart(self):
        self.start()
        self.stop()


def run(name):
    print "testing ....",name

def runt(obj,name):
    print obj.host+'...testing...'+name


if __name__ == '__main__':
    execute=sys.argv  #获取用户键入的参数
    server=Webserver('localhost',8080)
    server2=Webserver('127.0.0.1',80)

现在我们就来看看用户通过键入参数想要使用类中的方法有几种代码实现

一般版本

    #
    if execute[1]=='start':
        server.start()

    if execute[1] == 'stop':
        server.stop()

    if execute[1]=='restart':
        server.restart()

进阶版本

    #
    exe={'start':server.start,'stop':server.stop,'restart':server.restart}

    if execute[1] in exe:
        exe[execute[1]]()


最终版本

hasattr(p_object, name)

getattr(object, name, default=None)


    if hasattr(server,execute[1]):   #判断server是否还有用户键入的方法
        func=getattr(server,execute[1])   #获取实例方法的地址
        func()  #调用这个方法

setattr(p_object, name, value)

设置属性


    setattr(server,'test',run) #将run()函数转变成实例server中的test()方法
    #执行这个方法
    server.test('cmustard')  #testing .... cmustard

    #进阶版属性,如何让转化后的函数可以使用类属性,比如说实例中的host属性
    setattr(server,'testt',runt)
    #只需要将实例显式的传递给函数
    server.testt(server,'cmustard')  
    "localhost...testing...cmustard"

    server2.testt(server2,'cmustard')  
    "'Webserver' object has no attribute 'testt' "
    "由于这个函数只是传递给了实例server,因此其他实例是无法使用的"

delattr(p_object, name)

删除属性

    #删除实例server中的host属性
    delattr(server,'host')
    print server.host 
    "Webserver' object has no attribute 'host'"

    #如果想要删除方法,
    delattr(server,'start')  #AttributeError: start
    #以上这种是不可行的,因为方法数类属性,并不是实例属性

    #解决方法
    delattr(Webserver,'start')
    server.start()  #'Webserver' object has no attribute 'start'   删除成功

转载于:https://www.cnblogs.com/cmustard/p/6769926.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值