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)