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

    什么是反射(自省)?

    反射的概念是由Smith在1982年提出的,主要是指程序可以访问,检测和修改他本身状态或行为的一种能力(自省)。

    几种面向对象的反射属性

    • hasattr(object,name):判断object里有没有一个name字符串(‘属性名’)对应的方法或属性
    • getattr(object,name):获取属性值
    • setattr(object,name):修改或者新增属性及值
    • delattr(object,name):删除属性
    class Student(object):
        country = 'china'
        def __init__(self,name,age):
            self.name = name
            self.age = age
        def get_name(self):
            print('正在调用get_name方法。。。')
            return self.name
        def get_age(self):
            return self.age
     
     
    s = Student('bayi',33)
     
    # hasattr(object,name):判断object里有没有一个name字符串(‘属性名’)对应的方法或属性
    print(hasattr(s,'name')) # True
    print(hasattr(s,'get_name')) # True
    print(hasattr(s,'get_con')) # False
     
    # getattr(object,name):获取属性值
    print(getattr(s,'name')) # bayi
    print(getattr(s,'get_name')) # <bound method Student.get_name of <__main__.Student object at 0x000001426082D668>>
    # 获取方法信息返回的是方法名,想要运行方法,如何操作呢
    n = getattr(s,'get_name')
    print(n()) # bayi
     
    # setattr(object,name,newname):新增属性及值,修改属性及值
    setattr(s,'name','feng') # 修改属性及值
    print(s.name) # feng
    setattr(s,'aihao','famele')
    print(getattr(s,'aihao')) # famele
     
    # delattr(object,name):删除属性
    print(getattr(s,'age')) # 33
    delattr(s,'age')
    if hasattr(s,'age'):
        print(getattr(s,'age'))
    else:
        print('age属性不存在')
    # 结果:age属性不存在
     
     
    '''
    Python一切皆对象,文件也是对象,所有文件也可以反射
        需求:检测一下time这个当前模块有没有某些属性
        需求:检测当前模块有没有某些属性
    '''
    import time
    #     需求:检测一下time这个当前模块有没有某些属性
    print(hasattr(time,'ctime')) # True
    f = getattr(time,'ctime')
    print(f()) # Thu Apr 16 10:47:49 2020
     
    # 需求:检测当前模块有没有某些属性
    import sys
    # 获取当前模块对象
    # print(sys.modules)
    cur_obj = sys.modules[__name__] # 获取当前模块的对象
    print(hasattr(cur_obj,'a')) # False
    a = 22
    print(hasattr(cur_obj,'a')) # True
    
  • 相关阅读:
    前端知识 | 一个简单的登录页面包含多少前端基础知识?
    SQLserver查询作业、视图、函数、存储过程中的关键字
    SQL server 数据库备份至服务器本地磁盘和其他服务器磁盘
    Linux(centos)安装vim
    CentOS6 7 8更换阿里yum源
    centos8 最小化安装 无 ifconfig,netstat 的安装
    修改MySQL用户的host属性
    阿里云NTP服务器(国内可用的NTP服务器)
    vCenter Server Appliance(VCSA )7.0 部署指南
    Chrome离线安装包最新版
  • 原文地址:https://www.cnblogs.com/phyger/p/13753680.html
Copyright © 2011-2022 走看看