Python类中反射的作用

#coding:utf-8
‘‘‘
#反射的基本用法:

hasattr 判断一个方法是否存在于实例中
getattr 指定一个方法名字,获取该方法的内存地址,加"()"括号并可执行
‘‘‘
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__":
    #sys.argv[1]表示:接收用户输入的第一个参数

    #方法一:这种方法可以实现,但是很low(),不建议使用
    # server = WebServer("127.0.0.1",3306)
    # cmd_server = {"start":server.start,"stop":server.stop,"restart":server.restart}
    # if sys.argv[1] in cmd_server:
    #     cmd_server[sys.argv[1]]()

    # #方法二:但是这种方法有问题,怎么把用户输入的字符串名字调用对应的方法呢?
    # cmd_server = sys.argv[1]
    # if cmd_server in WebServer.__dict__:
    #     print(cmd_server)
    #     WebServer("127.0.0.1",3306).cmd_server  #cmd_server为用户输入的字符串名字,但是这样调用显然不行

    #方法三:利用hasattr和getattr方法判断方法是否存在对象中并获取对象中方法的内存地址
    server = WebServer("127.0.0.1",3306)
    if hasattr(server,sys.argv[1]):         #hasattr;判断类中是否包含某一个方法和属性
        func = getattr(server,sys.argv[1])  #getattr;获取server.start内存地址
        func()

‘‘‘
setattr绑定一个函数到实例

说明:如何把一个类之外的函数,绑定到实例里面呢?
‘‘‘
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 run_server(obj,name):
    print("runing is %s"%obj.restart(),name)

if __name__ == "__main__":
    server = WebServer("localhost",3306)
    setattr(server,‘run‘,run_server)  #通过setattr方法把test_run函数绑定到server这个实例里,方法名是"run"
    server.run(server,"apache")

‘‘‘
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 run_server(name):
    print("runing is %s",name)

if __name__ == "__main__":
    server = WebServer("localhost",3306)
    setattr(server,‘run‘,run_server)
    delattr(WebServer, "start")    #删除类里面的方法
    delattr(server, "host")        #删除实例的属性
    delattr(server,‘run‘)           #删除通过setattr添加到实例的属性
    print(server.__dict__,WebServer.__dict__)  #查看
时间: 2024-10-13 09:12:46

Python类中反射的作用的相关文章

Python 类中的 self?

什么是 self ? 它是类实例自身的引用.其他语言通常使用一个名为 this 的标识符 --<Python核心编程> 如何定义类: class ClassName(base_class[es]):  (1) "optional documentation string" static_member_declarations #类静态成员声明 method_declarations #类方法声明 (1) 括号内位基类,如果没有,就实用object作为基类 .....待续 P

两幅图说明python类中self的含义

总结:self是对于对象自身的引用.这里的圆括号里的self也可以换成其它你想要的任意名称,只是self更形象和通用些. 两幅图说明python类中self的含义

Python类中实例属性的通用显示工具

0.说明 以下的思想方法非常有用,可以帮助你在Python开发提高开发和维护效率,所以可能的话,请仔细琢磨一下其中的代码. 之前在用Python编写一个类时,为了显示的友好性,总是需要在每个类中重载__str__或者__repr__方法,现在有了更好的方法,不需要在每个类中都这么做了,下面给出的方法非常实用. 下面使用的例子使用的Python版本都是Python3.5,但实际上在Python2.7中进行也没有任何影响. 1.正常情况下类实例的不友好显示 在Python中编写一个类时,由于没有重载

python类中super()和__init__()的区别

本文和大家分享的主要是python开发中super()和__init__()的区别,希望通过本文的分享,对初学者学习这部分内容有所帮助. 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(self): print 'Base create' class childA(Base): def __init__(self): print 'creat A ', Base.__init__(self) class chi

python 类中的某个函数作为装饰器

在python的类中,制作一个装饰器的函数, class A: def wrapper(func): ###装饰器 def wrapped(self,*arg,**kwargs) ... return wrapped @ wrapper ###装饰mix def mix(): ... 当调用mix的时候,self.mix() ,会将self等参数传入 wrapper 中来吗?答案为否. 当wrapper作为装饰器的并且@wrapper这种方式作为装饰的时候,wrapper就跟普通的函数一样,仅仅

@property在python类中的应用

1.在类中,有时需要限制输入的内容,可以用一个set来输入需要的内容,用get来取得输入的内容 2.其实说白,上述所说的方法就是用来检查输入内容,让人们不能随心所欲的设置了. 参见下面的例子: 1 class Student(object): 2 def get_score(self): 3 return self.__score 4 def set_score(self, value): 5 if not isinstance(value, int): 6 raise ValueError("

Python类(四)-反射

反射即通过字符串映射或修改程序运行时的状态.属性.方法 有4个方法: hasattr(): hasattr(object,string):object为实例化的对象,string为字符串 判断对象object里是否有对应字符串string的方法或属性,返回布尔型 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" class Person(object): def __init__(self,name): self.name = nam

python类中几个特殊方法

class TT: def __init__(self): print "__init__" def __call__(self): print "__call__" def __str__(self): return "__str__" def __int__(self): return "__int__" def __add__(self,other): return "__add__" def __s

Python类中的魔法方法之 __slots__

在类中每次实例化一个对象都会生产一个字典来保存一个对象的所有的实例属性,这样非常的有用处,可以使我们任意的去设置新的属性. 每次实例化一个对象python都会分配一个固定大小内存的字典来保存属性,如果对象很多的情况下会浪费内存空间. 可通过__slots__方法告诉python不要使用字典,而且只给一个固定集合的属性分配空间 class Foo(object): __slots__ = ("x","y","z") def __init__(sel