反射的妙用

 

python面向对象中的反射:通过字符串的形式操作对象相关的属性,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("start......")

    def stop(self):
        print("stop...")

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


#若想把该方法绑定到类WebServer的实例上则可使用setattr()
#对于python对象而言,属性包括变量和方法
#若不传递self参数,则无法调用类中定义的属性和方法
def test_run(self,name):
    print("running...",name,self.host)


if __name__ == "__main__":
    server = WebServer("localhost",333)
    #根据用户输入命令,执行相应操作
    if hasattr(server,sys.argv[1]):
        func = getattr(server,sys.argv[1]
        func()
    
    setattr(server,"run",test_run)#给该实例绑定属性,只在该实例里有
    server.run(server,"zhangsan")


    delattr(server,"restart") #若调用该句则报错,AttributeError:restart
    #因为server是一个实例,而该方法是在类里的
    delattr(WebServer,"restart")  #可通过这种方法删除类方法


    delattr(server,"host")#可执行

isinstance(obj,cls)检查是否obj是否是类 cls 的对象:

class Foo:
    pass
class Son(Foo):
    pass
s=Son()

print(isinstance(s,Son))

issubclass(sub, super)检查sub类是否是 super 类的派生类 :

class Foo(object):
    pass
 
class Bar(Foo):
    pass
 
issubclass(Bar, Foo)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值