zoukankan      html  css  js  c++  java
  • 【python】-- 类的反射

    反射

    反射我们以后会经常用到,这个东西实现了动态的装配,通过字符串来反射类中的属性和方法

     一、反射函数

    1、hasarttr(obj,name_str)

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

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

      

    2、getattr(obj,name_str)

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

    class Dog(object):
     
        def __init__(self,name):
            self.name = name
     
        def eat(self,food):
            print("{0} is eating...{1}".format(self.name,food))
     
    d = Dog("shabi")
    choice = input(">>>:").strip()
     
    print(getattr(d,choice))  #choice获取obj对象中的对应方法的内存地址或者对应属性的值
     
    #输出
    >>>:name  #返回name属性的值
    shabi
    >>>:eat
    <bound method Dog.eat of <__main__.Dog object at 0x00000157A129CF28>>  #返回eat方法的内存地址
    

      

    3、setattr(x,y,z)

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

    ①给对象新增一个新方法

    def bulk(self):  #先定义一个bulk函数
        print("{0} is yelling...".format(self.name))
     
    class Dog(object):
     
        def __init__(self,name):
            self.name = name
     
        def eat(self,food):
            print("{0} is eating...{1}".format(self.name,food))
     
    d = Dog("shabi")
    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
    shabi is yelling...

    ②给对象新增一个属性

    class Dog(object):
     
        def __init__(self,name):
            self.name = name
     
        def eat(self,food):
            print("{0} is eating...{1}".format(self.name,food))
     
    d = Dog("shabi")
    choice = input(">>>:").strip()
     
    setattr(d,choice,22)  #输入的是age,所以又等同于d.age = 22
    # print(d.age) 这样就写死了,还是用下面一种
    print(getattr(d,choice))
     
    #输出
    >>>:age
    22

     

    4、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("{0} is eating...{1}".format(self.name,food))
     
    d = Dog("shabi")
    choice = input(">>>:").strip()
     
    delattr(d,choice) #根据字符串删除属性或者方法
    print(d.name)
    print(d.eat)
     
    #输出
    >>>:name   #删除属性name
    Traceback (most recent call last):
      File "E:/PycharmProjects/pythontest/day7/反射/反射.py", line 22, in <module>
        print(d.name)
    AttributeError: 'Dog' object has no attribute 'name'
    >>>:eat   #删除方法eat
    Traceback (most recent call last):
      File "E:/PycharmProjects/pythontest/day7/反射/反射.py", line 21, in <module>
        delattr(d,choice)
    AttributeError: eat

     

    5、综合使用hasattr、getattr、setattr

    class Dog(object):
     
        def __init__(self,name):
            self.name = name
     
        def eat(self,food):
            print("{0} is eating...{1}".format(self.name,food))
     
    d = Dog("shabi")
    choice = input(">>>:").strip()
     
    if hasattr(d,choice):  #判断d对象中存在属性和方法
        name_value = getattr(d,choice)  #获取属性值
        print(name_value)
        setattr(d,choice,"hong")   #修改属性值
        print(getattr(d,choice))   #重新获取属性的值
    else:
        setattr(d,choice,None)    #设置不存在的属性值为None
        v = getattr(d,choice)
        print(v)
     
    #输出
    >>>:name
    shabi
    hong
    >>>:abc
    None
  • 相关阅读:
    第4月第1天 makefile automake
    第3月30天 UIImage imageWithContentsOfFile卡顿 Can't add self as subview MPMoviePlayerControlle rcrash
    第3月第27天 uitableviewcell复用
    learning uboot fstype command
    learning uboot part command
    linux command dialog
    linux command curl and sha256sum implement download verification package
    learning shell script prompt to run with superuser privileges (4)
    learning shell get script absolute path (3)
    learning shell args handing key=value example (2)
  • 原文地址:https://www.cnblogs.com/Keep-Ambition/p/7298636.html
Copyright © 2011-2022 走看看