• 面向对象【day08】:反射(五)


    本节内容

    1. 概述
    2. 反射函数
    3. 综合使用

    一、概述

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

    二、反射函数

    2.1 hasarttr(obj,name_str)

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class Dog(object):
     
        def __init__(self,name):
            self.name = name
     
        def eat(self,food):
            print("{0} is eating...{1}".format(self.name,food))
     
    = Dog("shabi")
    choice = input(">>>:").strip()
     
    print(hasattr(d,choice))  #obj中是否有对应的choice字符串的属性或者方法
     
    #输出
    >>>:name  #输入对象存在属性
    True
    >>>:eat  #输入对象存在的方法
    True

    2.2 getattr(obj,name_str)

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class Dog(object):
     
        def __init__(self,name):
            self.name = name
     
        def eat(self,food):
            print("{0} is eating...{1}".format(self.name,food))
     
    = 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方法的内存地址

    2.3 setattr(x,y,z)

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

    ①给对象新增一个新方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    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))
     
    = 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...

    ②给对象新增一个属性

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class Dog(object):
     
        def __init__(self,name):
            self.name = name
     
        def eat(self,food):
            print("{0} is eating...{1}".format(self.name,food))
     
    = Dog("shabi")
    choice = input(">>>:").strip()
     
    setattr(d,choice,22)  #输入的是age,所以又等同于d.age = 22
    # print(d.age) 这样就写死了,还是用下面一种
    print(getattr(d,choice))
     
    #输出
    >>>:age
    22

    2.4  delattr(x,y)

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    class Dog(object):
     
        def __init__(self,name):
            self.name = name
     
        def eat(self,food):
            print("{0} is eating...{1}".format(self.name,food))
     
    = 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 22in <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 21in <module>
        delattr(d,choice)
    AttributeError: eat

    三、综合使用

    3.1 综合使用hasattr、getattr、setattr

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    class Dog(object):
     
        def __init__(self,name):
            self.name = name
     
        def eat(self,food):
            print("{0} is eating...{1}".format(self.name,food))
     
    = 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
        = getattr(d,choice)
        print(v)
     
    #输出
    >>>:name
    shabi
    hong
    >>>:abc
    None
  • 相关阅读:
    通过wireshark抓包来讲解HTTP中Connection: keep-alive头部的作用
    spring cloud连载第三篇补充之Zuul
    Redis管理各类型存储数据命令
    Redis管理key命令
    Redis命令
    Redis数据类型
    Redis配置文件
    Redis安装
    Redis简介
    SpringBoot项目报错Cannot determine embedded database driver class for database type NONE
  • 原文地址:https://www.cnblogs.com/luoahong/p/7208436.html
Copyright © 2020-2023  润新知