Python之面向对象-反射

一、什么是反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问,检测和修改它本省状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

python面向对象中的反射:通过字符串的形式操作对象相关的属性。Pythonn中的一切事物都是对象(都可以使用反射)

反射四种方法

一切皆对象,类本身也是一个对象

hasattr

def hasattr(*args, **kwargs): # real signature unknown
"""
    Return whether the object has an attribute with the given name.

    This is done by calling getattr(obj, name) and catching AttributeError.

"""
    pass

getattr

def getattr(object, name, default=None): # known special case of getattr
"""
    getattr(object, name[, default]) -> value

    Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.

    When a default argument is given, it is returned when the attribute doesn't
    exist; without it, an exception is raised in that case.

"""
    pass

setattr

def setattr(x, y, v): # real signature unknown; restored from __doc__
"""
    Sets the named attribute on the given object to the specified value.

    setattr(x, 'y', v) is equivalent to .y = v''
"""
    pass

delattr

def delattr(x, y): # real signature unknown; restored from __doc__
"""
    Deletes the named attribute from the given object.

    delattr(x, 'y') is equivalent to  x.y''
"""
    pass

三、案例

class Foo:
    f = '类的静态变量'
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def say_hi(self):
        print('hi,%s'%self.name)

obj=Foo('john',73)

#检测是否含有某属性
print(hasattr(obj,'name'))
print(hasattr(obj,'say_hi'))

#获取属性
n=getattr(obj,'name')
print(n)
func=getattr(obj,'say_hi')
func()

print(getattr(obj,'aaaaaaaa','不存在啊')) #报错

#设置属性
setattr(obj,'sb',True)
setattr(obj,'show_name',lambda self:self.name+'sb')
print(obj.__dict__)
print(obj.show_name(obj))

#删除属性
delattr(obj,'age')
delattr(obj,'show_name')
delattr(obj,'show_name111')#不存在,则报错

print(obj.__dict__)

Original: https://www.cnblogs.com/baishuchao/p/9317063.html
Author: baishuchao
Title: Python之面向对象-反射

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612163/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • vue2和nginx配置Gzip

    减小js和css文件大小,提高首屏速度。虽然也没有快到哪里去(可能是因为我没有调参),但js、css文件的大小都大幅度减小了。参考:https://blog.csdn.net/qq…

    Linux 2023年6月7日
    0103
  • 30道关于linux的基础命令小题,先练练手

    1.修改主机名为yuanlai0224命令是: 2.切换⽬录到/yuchao01/data/,再创建脚本/my_website/scripts/start.sh。 绝对路径、相对路…

    Linux 2023年5月27日
    097
  • 【原创】Linux v4l2框架分析

    背景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. –…

    Linux 2023年5月27日
    076
  • Vim 常规教程

    vim 入门到进阶 vim 有四种使用模式 编辑模式, 按 ESC切换 写入模式, 在编辑模式 按 a i 切换 可选模式, 在编辑模式 按 v V 切换 命令模式, 在编辑模式 …

    Linux 2023年6月7日
    0121
  • 使用JMeter和Zabbix进行压力测试

    Zabbix JMeter 目标 reference Zabbix Zabbix区分探针端、服务端、数据库、WEB前端等多个组件,如果你是在企业内使用,尽量使用运维同学搭建好的环境…

    Linux 2023年6月6日
    090
  • jmeter接口关联-后置处理器(正则表达式)

    接口测试通过会涉及到两个接口之间的关联,前一个接口的返回数据作为到下一个接口的入参,这时候就需要用到后置处理器,其中有正则表达式提取器、XPath提取器、JSON提取器,今天先示范…

    Linux 2023年6月8日
    084
  • 如何在 python 中解决 ImportError: DLL load failed while importing win32api

    问题描述 安装完 pywin32 之后,如果直接在代码中 import win32api 可能会报下述错误: ImportError: DLL load failed while …

    Linux 2023年6月7日
    084
  • Redis基础

    1.简介 Redis (远程字典服务器)是一 个开源的、使用C语言编写的NoSQL数据库。Redis基于内存运行并支持持久化,采用 key-value (键值对)的存储形式,是目前…

    Linux 2023年6月13日
    079
  • python 内置模块

    #!/usr/bin/env python -*- coding:utf-8 -*- import time #时间模块 print(time.time())#当前时间戳 #本地时…

    Linux 2023年6月13日
    074
  • python_列表

    列表创建 列表类似数组,但是以一对方括号 []作为符号,同时支持-1到-n的下标访问。列表中包含的是元素值的引用 并且,列表中的元素可以不是同一类型的 列表的创建: listNew…

    Linux 2023年6月7日
    0143
  • shell 同时执行多任务下载视频

    本文为博主原创,转载请注明出处: shell 脚本不支持多线程,但我们需要用shell 脚本同时跑多个任务时怎么让这些任务并发同时进行,可以采用在每个任务 后面 添加一个 &amp…

    Linux 2023年5月28日
    0104
  • 白话linux操作系统原理

    虽然计算机相关专业,操作系统和计算机组成原理是必修课。但是大学时和真正从事相关专业工作之后,对于知识的认知自然会发生变化。还很有可能,一辈子呆在学校的老师们只是照本宣科,自己的理解…

    Linux 2023年5月27日
    0112
  • Nginx基础入门篇(2)—编译参数介绍

    查看命令 nginx -V nginx version: nginx/1.22.0 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (…

    Linux 2023年6月6日
    0130
  • UWP graphql-dotnet新版数据查询客户端的实现

    之前写过一篇文章 UWP GraphQL数据查询客户端的实现,这次的标题基本差不多,只不过微软这个graphql-dotnet repo从1.x升级到了3.x,跨度有点大。 如果你…

    Linux 2023年6月13日
    088
  • MySQL环境变量配置方法

    MySQL配置方法 下载免安装版本的MySQL数据库,大家根据自己的开发环境下载对应版本的数据库,我在此举例的是Windows系统下的配置方法,下载地址如下: https://de…

    Linux 2023年6月7日
    098
  • 操作系统

    第1章习题1. 设计现代OS的主要目标是什么? OS的作用可表现在哪几个方面? 为什么说操作系统实现了对计算机资源的抽象? 试说明推动多道批处理系统形成和发展的主要动力是什么。 何…

    Linux 2023年6月6日
    083
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球