python之面向对象之反射运用

先看下hasattr和getattr在反射中的用法

import sys
class apache(object):
    def __init__(self,tcp):
        self.tcp = tcp
    def start(self):
        print("apache is starting,host id is [%s]" %self.tcp)
    def stop(self):
        print("apache is stoping,host id is [%s]" %self.tcp)
    def restart(self):
        self.stop()
        self.start()

if __name__ == ‘__main__‘:
    server = apache("333")
    if hasattr(server,sys.argv[1]):                #判断实例中是否有ays.argv[1]这个方法
        func = getattr(server,sys.argv[1])         #获取server.sys.argv[1]方法的内存地址
        func()                                     #执行server.sys.argv[1]这个方法

# apache is starting,host id is [333]

再看下setattr在反射中的运用

import sys
class apache(object):
    def __init__(self,tcp):
        self.tcp = tcp
    def start(self):
        print("apache is starting,host id is [%s]" %self.tcp)
    def stop(self):
        print("apache is stoping,host id is [%s]" %self.tcp)
    def restart(self):
        self.stop()
        self.start()

def test_run(name):
    print("running",name)

if __name__ == ‘__main__‘:
    server = apache("333")
    setattr(server,"run",test_run)
#我们可以看到,本来server这个实例本身是没有test_run这个方法的,且test_run和apache这个类根本就没有任何关系,但是我们通过setattr方法,就可以把外面的函数赋值给
#某个实例,比如这里的例子,我们就把函数test_run的内存地址赋值给了server.run,也就是说test_run == server.run
#注意,这里只绑定到server这实例上,其他实例还是不能用test_run这个方法的
    server.run("alex")

#上面的例子中,在test_run中不能使用实例变量,我们可以通过下面的方法就可以实现test_run函数可以调用实例变量

#定义函数需要按照下面的格式来定义
def test_run(self,name):
    print("running",name,self.tcp)

if __name__ == ‘__main__‘:
    server = apache("333")
    setattr(server,"run",test_run)
    #调用的时候需要这样调用
    server.run(server,"alex")

最后看下delattr在反射中的运用

import sys
class apache(object):
    def __init__(self,tcp):
        self.tcp = tcp
    def start(self):
        print("apache is starting,host id is [%s]" %self.tcp)
    def stop(self):
        print("apache is stoping,host id is [%s]" %self.tcp)
    def restart(self):
        self.stop()
        self.start()

if __name__ == ‘__main__‘:
    server = apache("1000")
    # delattr(server,"stop")
    # server.stop()

    #这样的写法是错误的,因为stop这个方法不属于对象,而属于类,所以删除对象中的stop方法肯定是不可以的
    print(server.tcp)
    # 1000
    # delattr(server,"tcp")
    # print(server.tcp)
    #所以如果我们删除对象的话,只能删除对象的变量,上面这个例子,我们就可以删除对象中的变量,然后在打印就发现没有这个值了

    # 所以如果要删除方法,那么我们只能删除类的方法,而不能删除对象的方法,因为方法都是属于类的

    #在删之前我们先判断一下对象中是否有stop这个方法
    if hasattr(apache,"stop"):
        print(True)
    else:
        print(False)

    # True  结果证明有stop这个方法

    #在删之后我们在判断一下对象中是否有stop这个方法
    delattr(apache,"stop")
    if hasattr(apache,"stop"):
        print(True)
    else:
        print(False)
    # False 结果证明没有stop这个方法

  

时间: 2024-12-27 23:57:12

python之面向对象之反射运用的相关文章

Python之面向对象进阶------反射(Day26)

一 classmethod class Classmethod_Demo(): role = 'dog' @classmethod def func(cls): print(cls.role) Classmethod_Demo.func() staticmethod class Staticmethod_Demo(): role = 'dog' @staticmethod def func(): print("当普通方法用") Staticmethod_Demo.func() clas

python ==》 面向对象的反射,(isinstance and issubclass)

1.staticmethod:(静态方法) 静态方法:让类里的方法直接被类调用,就像正常的函数一样. class Staticmethod_Demo(): role = 'Aray' @staticmethod def func(): print('当普通方法用') Staticmethod_Demo.func() 输出结果: 当普通方法用 2.classmethod:(类方法) 类方法:默认参数为:cls  ,可以直接用类名调用,可以与类属性交互. class Classmethod_Demo

Python学习【第14篇】:面向对象之反射以及内置方法

面向对象之反射及内置方法 一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被类调用,就像正常调用函数一样 类方法和静态方法的相同点:都可以直接被类调用,不需要实例化 类方法和静态方法的不同点: 类方法必须有一个cls参数表示这个类,可以使用类属性 静态方法不需要参数 绑定方法:分为普通方法和类方法 普通方法:默认有一个self对象传进来,并且只能被

面向对象之反射

一:什么是反射 反射是指程序可以访问,检测和修改它本身状态或行为的一种能力. 二:Python面向对象的反射:通过字符串的形式操作对象相关的属性. python中一切事物都是对象(都可以使用反射) 三:反射的好处 1实现可插拔机制 反射的好处就是,可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,即你可以事先把主要的逻辑写好(只定义接口),然后后期再去实现接口的功能 class FtpClient: 'ftp客户端,但是还么有实现具体的功能' def __init__(sel

what' the python之面向对象(进阶)

面向对象的知识点补充(进阶版) classmethod和staticmethod:这两个函数的用途就是可以不用实例化对象就可以调用方法 class Classmethod_Demo(): role = 'dog' @classmethod def func(cls): print(cls.role) Classmethod_Demo.func() class Staticmethod_Demo(): role = 'dog' @staticmethod def func(): print("当普

Python学习—面向对象学习下

面向对象下 1.构造方法与析构方法 class People(object): # 构造方法:__init__(),在实例化对象时自动执行的方法 def __init__(self, name, age): self.name = name self.age = age print("创建对象成功.......") # 析构函数:__del__(), 当你删除对象时,自动调用的方法 # 删除对象:del 对象名 def __del__(self): print("删除对象成功

My way to Python - Day05 - 面向对象-思维导图

My way to Python - Day05 - 面向对象 思维导图

Python -面向对象(一 基本概念)

一 Python简单介绍 Python是一个可移植的面向对象的脚本语言. Python尽管是一个脚本语言,但也是一个全然面向对象的语言. 由于它设计之初把易用性做为很重要的一个考量标准,所以用起来很简洁,优美(语法很灵活).所以使用Python能够高速地编写出可执行代码.与C/C++相比.Python程序的执行速度比較慢,一门语言既然能够生存下来.就有它自己的原因,Python语言也一样. 当今的计算机处理速度已经很快.对某些任务来说.执行速度并非首要考虑的因素.比方说为了实现数据库訪问的自己主

Python的面向对象3

接下来,我们接着讲Python的面向对象,在上一次的博客中,我们详细介绍了类与对象的属性,今天,我们来详细介绍一下面向对象中的方法! 1.定义实例方法 一个实例的私有属性就是以__开头的属性,无法被外部访问,但是,从类的内部是可以访问的,除了可以定义实例的属性,还可以定义实例的方法. 其实,实例的方法就是在类中定义函数,它的第一个参数永远是self,指向调用该方法的实例本身,其他参数和普通参数一致. get_name()就是一个实例方法,它的第一个参数是self,这个参数不需要显示传入 调用实例