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)

原文地址:https://www.cnblogs.com/huangxm/p/5354524.html