zoukankan      html  css  js  c++  java
  • Python-面向对象之反射

    反射

      实现了动态的装配,通过字符串来反射类中的属性和方法。

    一、hasarttr(obj,name_str)

    作用:判断一个对象obj中是否有对应的name_str字符串的属性或者方法。

    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        def eat(self, food):
            print("%s is eating %s" % (self.name, food))
    
    
    d = Dog("Tom")
    d.eat('Apple')
    choice = input(">>>:").strip()
    
    print(hasattr(d, choice))  # obj中是否有对应的choice字符串的属性或者方法
    
    # # 输出
    # >>>:name  # 输入对象存在属性
    # True
    # >>>:eat  # 输入对象存在的方法
    # True
    

    二、getattr(obj,name_str)

    作用:根据字符串name_str获取obj对象中的对应方法的内存地址或者对应属性的值。

    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        def eat(self, food):
            print("%s is eating %s" % (self.name, food))
    
    
    d = Dog("Tom")
    d.eat('Apple')
    choice = input(">>>:").strip()
    
    print(getattr(d, choice))    # 获取d对象中的对应方法的内存地址或者对应属性的值
    
    # >>>:name  # 获取输入对象的值
    # Tom
    # >>>:eat   # 获取输入对象的方法
    # <bound method Dog.eat of <__main__.Dog object at 0x000002A4ADB732E8>>
    

    三、setattr(x,y,z)

    作用:给obj对象添加一个新属性或者新方法,setattr(x, 'y', v) is equivalent to ``x.y = v''。

    1、给对象新增一个新方法

    def bulk(self):  # 先定义一个bulk函数
        print("%s is yelling..." % self.name)
    
    
    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        def eat(self, food):
            print("%s is eating %s" % (self.name, food))
    
    
    d = Dog("Tom")
    choice = input(">>>:").strip()
    
    setattr(d, choice, bulk)  # 输入的是talk,所以又等同于d.talk = bulk
    # d.talk(d) 直接写死,用d.talk(d),一般不这么写
    func = getattr(d, choice)  # 用getattr来获取
    func(d)
    
    # 输出
    # >>>:talk
    # Tom is yelling...
    

    2、给对象新增一个属性

    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        def eat(self, food):
            print("%s is eating %s" % (self.name, food))
    
    
    d = Dog("Tom")
    choice = input(">>>:").strip()
    
    setattr(d, choice, 'Apple')  # food,所以又等同于d.food = 'Apple'
    # print(d.food) 这样就写死了,还是用下面一种
    print(getattr(d, choice))
    
    # 输出
    # >>>:food
    # Apple
    

    四、delattr(x,y)

    作用:删除obj对象中的属性或者方法,delattr(x, 'y') is equivalent to ``del x.y''

    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        def eat(self, food):
            print("%s is eating %s" % (self.name, food))
    
    
    d = Dog("Tom")
    choice = input(">>>:").strip()
    
    delattr(d, choice)  # 根据字符串删除属性或者方法
    print(d.name)
    print(d.eat)
    

    五、综合使用hasattr、getattr、setattr

    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        def eat(self, food):
            print("%s is eating %s" % (self.name, food))
    
    
    d = Dog("Tom")
    choice = input(">>>:").strip()
    
    if hasattr(d, choice):  # 判断d对象中存在属性和方法
        name_value = getattr(d, choice)  # 获取属性值
        print(name_value)
        setattr(d, choice, "Jerry")  # 修改属性值
        print(getattr(d, choice))  # 重新获取属性的值
    else:
        setattr(d, choice, None)  # 设置不存在的属性值为None
        v = getattr(d, choice)
        print(v)
    
  • 相关阅读:
    Web Workers 的基本信息
    关于前端框架的一些观点
    解密jQuery内核 DOM操作方法(二)html,text,val
    解密jQuery内核 DOM操作
    解密jQuery内核 DOM操作的核心buildFragment
    解密jQuery内核 DOM操作的核心函数domManip
    前端MVC框架Backbone 1.1.0源码分析(二)
    前端MVC框架Backbone 1.1.0源码分析(一)
    解密jQuery内核 Sizzle引擎筛选器
    解密jQuery事件核心
  • 原文地址:https://www.cnblogs.com/kirusx/p/6974260.html
Copyright © 2011-2022 走看看