ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

面向对象之反射

2020-09-15 09:31:22  阅读:149  来源: 互联网

标签:反射 Foo obj self 面向对象 print foo True


一、 isinstance(obj,cls)和issubclass(sub,super)

isinstance与issubclass是python的内置模块:

isinstance: 判断一个对象是否是另一个类的实例。
- 如果是: True
- 如果不是: False

issubclass: 判断一个类是否是另一个类的子类。

- 如果是: True
- 如果不是: False   

# isinstance
class Foo:
    pass
class Boo:
    pass

foo_obj = Foo()
boo_obj = Boo()

print(isinstance(foo_obj, Foo))  # True
print(isinstance(boo_obj, Foo))  # False
#issubclass
class Father:
    pass
class Sub(Father):
    pass
class Foo:
    pass

print(issubclass(Sub,Father))  #True    
print(issubclass(Foo,Father))  #False

二、反射

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

  • hasattr: 通过 “字符串” 判断对象的属性或方法是否存在。

  • getattr: 通过 “字符串” 获取对象的属性或方法。

  • setattr: 通过 “字符串” 设置对象的属性或方法。

  • delattr: 通过 “字符串” 删除对象的属性或方法。

注意: 反射的四个方法是python内置的

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

foo_obj = Foo(10,20)

#hasattr 通过字符串x 判断对象中是否有 x属性
print(hasattr(foo_obj,'x'))  #True
print(hasattr(foo_obj,'z'))  #False

#getattr 通过 字符串 获取对象的属性或方法
print(getattr(foo_obj,'x'))  #10
#若属性不存在,则返回默认值
res = getattr(foo_obj,'z','默认值')
print(res) #默认值

#setattr
# 为foo_obj设置一个属性z,值为30
setattr(foo_obj,'z',30)
print(hasattr(foo_obj,'z'))  #True

#delattr
delattr(foo_obj,'z')
print(hasattr(foo_obj,'z'))  #False
反射应用:

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('文件正在下载')
filecontrol_obj = FileControl()
filecontrol_obj.run()

 

                          

标签:反射,Foo,obj,self,面向对象,print,foo,True
来源: https://www.cnblogs.com/wddxx/p/13671331.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有