码迷,mamicode.com
首页 > 其他好文 > 详细

面对对象之反射

时间:2019-11-28 21:31:47      阅读:81      评论:0      收藏:0      [点我收藏+]

标签:getattr   block   UNC   输入   data-   用户   字符串   user   方法   

TOC

一、什么是反射

反射指的是通过 “字符串” 对 对象的属性进行操作

反射的四个方法是python内置的!

1.1 hasattr

通过“字符串”判断对象的属性或方法是否存在,返回bool值。

class Foo:
    def __init__(self, x, y):
        self.x = x
        self.y = y


foo_obj = Foo(10, 20)

print(hasattr(foo_obj, ‘x‘))  # 通过字符串x判断,因此此时X要用引号引起来
print(hasattr(foo_obj, ‘z‘))


>>>True
>>>False

1.2 getattr

通过“字符串”获取对象的属性或方法,若存在,返回value,若不存在,会报错,当然也可以定义若不存在返回的值。

class Foo:
    def __init__(self, x, y):
        self.x = x
        self.y = y


foo_obj = Foo(10, 20)

print(getattr(foo_obj, ‘x‘))
print(getattr(foo_obj, ‘z‘))


>>>10
>>>AttributeError: ‘Foo‘ object has no attribute ‘z‘


# 若不存在可以定义返回的信息
print(getattr(foo_obj, ‘z‘, ‘我是自定义返回的信息‘))

>>>我是自定义返回的信息

1.3 setattr

通过“字符串”设置对象的属性和方法。

class Foo:
    def __init__(self, x, y):
        self.x = x
        self.y = y


foo_obj = Foo(10, 20)
setattr(foo_obj, ‘x‘, 30)  # 设置x的值,若存在就修改value,若不存在就新增属性

print(getattr(foo_obj, ‘x‘))

1.4 delattr

通过“字符串”删除对象的属性和方法。

class Foo:
    def __init__(self, x, y):
        self.x = x
        self.y = y


foo_obj = Foo(10, 20)
delattr(foo_obj, ‘x‘)  # 删掉x的属性

print(getattr(foo_obj, ‘x‘, ‘None‘))  # 不存在返回None


>>> None

二、反射的应用

class FileControl:
    def run(self):
        while True:
            # 让用户输入上传或下载功能的命令
            user_input = input(‘请输入 上传(upload) 或 下载(download) 功能:‘).strip()
            if hasattr(self, user_input):
                func = getattr(self, user_input)
                func()
            else:
                print(‘输入有误!‘)

    def upload(self):
        print(‘文件正在上传‘)

    def download(self):
        print(‘文件正在下载‘)


file_control = FileControl()
file_control.run()




面对对象之反射

标签:getattr   block   UNC   输入   data-   用户   字符串   user   方法   

原文地址:https://www.cnblogs.com/cnhyk/p/11953526.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!