python自省与反射

DAY 5. python自省

这是很久之前写的,当时对自省和反射的概念没理解,学习Java以后多了一点理解,自省是获取对象的能力,反射是操纵对象的能力,python中使用getattr()setattr()实现反射,而其他的则是自省,下面的内容是把两者混在一起说的,但又不想改了,内容罗里吧嗦,把最终的总结提到前面

方法作用
help()查看函数或模块用途的详细说明
dir()返回对象所有属性
type()查看对象类型
hasattr()查看对象是否有特定属性
getattr()得到对象的特定属性
setattr()设置对象的特定属性
isinstance()判断一个对象是否是一个已知的类型
issubclass()判断一个类是不是另一个类的子类
id()返回地址值
callable()判断对象是否可调用

In computing, type introspection is the ability of a program to examine the type or properties of an object at runtime. Some programming languages possess this capability.
在计算机科学中,内省是指计算机程序在运行时(Run time)检查对象(Object)类型的一种能力,通常也可以称作运行时类型检查

这是维基百科对自省(内省)的解释,通俗来说,自省就是在程序运行过程中,能够知道对象的类型的一种能力,大部分语言都有这种能力(都有办法在运行过程中知道对象的类型),如c++,Java等

当然自省不仅仅只针对对象的类型,如python自省还能知道对象的属性,还有一些其他的理解

在日常生活中,自省(introspection)是一种自我检查行为。

在计算机编程中,自省是指这种能力:检查某些事物以确定它是什么、它知道什么以及它能做什么。自省向程序员提供了极大的灵活性和控制力。

说的更简单直白一点:自省就是面向对象的语言所写的程序在运行时,能够知道对象的类型。简单一句就是,运行时能够获知对象的类型。

例如c++自省(来自维基百科)

C ++通过运行时类型信息(RTTI)typeid和dynamic_cast关键字支持类型内省。 dynamic_cast表达式可用于确定特定对象是否属于特定派生类。 例如:

Person* p = dynamic_cast<Person *>(obj);
if (p != nullptr) {p->walk();
}

typeid运算符检索std :: type_info对象,该对象描述对象的派生类型:

if (typeid(Person) == typeid(*obj)) {serialize_person( obj );
}

php自省(来自维基百科)

在php中,可以使用instanceof运算符判断一个PHP变量是否属于某一类的实例

if ($obj instanceof Person) {// Do whatever you want
}

Java自省(来自维基百科)

Java中类型自省的最简单示例是instanceof运算符。 instanceof运算符确定特定对象是属于特定类(或该类的子类,还是实现该接口的类)。 例如:

if (obj instanceof Person) {Person p = (Person)obj;p.walk();
}

5.1 python实现自省的办法

python实现自省有很多方法,常用的有 help(),dir(),type(),hasattr(),getattr(),setattr(),isinstance(),issubclass(),id(),callable()

5.1.1 help()

help() 函数用于查看函数或模块用途的详细说明。主要在IDE环境下是用,接受任何拥有函数或者方法的对象,打印出对象所有的函数和文档字符串

如可以直接打印出os模块的帮助文档

import os
help(os)
# Help on module os:
#
# NAME
#     os - OS routines for NT or Posix depending on what system we're on.
#
# DESCRIPTION
# 后面的省略了

也可以是我们自定义的类,函数,或模块

class Demo:"""this is a Demo"""classVar = 0def __init__(self):self.var1 = 1def output(self):print(self.var1)if __name__ == '__main__':help(Demo)

运行之后会打印出这个类的完整信息

Help on class Demo in module __main__:class Demo(builtins.object)|  this is a Demo|  |  Methods defined here:|  |  __init__(self)|      Initialize self.  See help(type(self)) for accurate signature.|  |  output(self)|  |  ----------------------------------------------------------------------|  Data descriptors defined here:|  |  __dict__|      dictionary for instance variables (if defined)|  |  __weakref__|      list of weak references to the object (if defined)|  |  ----------------------------------------------------------------------|  Data and other attributes defined here:|  |  classVar = 0

实例对象会打印出类的信息

函数会打印出帮助文档,没有文档会打印none

 def demoMethods(a):"""这是一个示例函数:param a: 示例形参:return: None"""print(a)help(demoMethods)
# Help on function demoMethods in module __main__:# demoMethods(a)
#     这是一个示例函数
#     :param a: 示例形参
#     :return: None

更详细的请看这篇文章

Python-自省机制

5.1.2 dir()

dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。如果参数包含方法__dir__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。

dir()
['__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'sys']
dir([])
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

5.1.3 hasattr(),getattr(),setattr()

class Demo:def __init__(self):self.var1 = 0self.var2 = 1if __name__ == '__main__':demo = Demo()if hasattr(demo,'var1'):setattr(demo,'var1',2)print(getattr(demo,'var1','not find'))  # 2print(getattr(demo,'var11','not find'))  # not find
  • 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.这是通过调用getattr(obj,name)并捕获AttributeError来完成的."""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 ``x.y = v''setattr(x,‘y’,v)等价于“x.y=v”"""pass
  • getattr()
def getattr(object, name, default=None): # known special case of getattr"""getattr(object, name[, default]) -> valueGet 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'texist; without it, an exception is raised in that case.从对象中获取指定名称的属性;getattr(x,‘y’)等同于X.Y。如果给定了默认参数,则未找到该属性时将返回该参数。如果未指定,则会引发异常。"""pass

5.1.4 isinstance(),issubclass()

>>> help(isinstance)
Help on built-in function isinstance in module builtins:isinstance(obj, class_or_tuple, /)Return whether an object is an instance of a class or of a subclass thereof.返回对象是类的实例还是其子类的实例。A tuple, as in ``isinstance(x, (A, B, ...))``, may be given as the target tocheck against. This is equivalent to ``isinstance(x, A) or isinstance(x, B)or ...`` etc.

instance类似于type(),只不过type() 不会认为子类是一种父类类型,不考虑继承关系。isinstance() 会认为子类是一种父类类型,考虑继承关系。

>>> class A:pass>>> a = A()
>>> isinstance(a,type)
False
>>> class B(A):pass>>> b=B()
>>> isinstance(b,A)
True
>>> isinstance(int,type)
True
>>> isinstance(A,type)
True
>>> isinstance(b,type)
False
>>> isinstance(True,int)
True

可以看出类是type的子类型,也验证了前天的元类,而布尔是int的子类

而issubclass()则是用来判断一个类是不是另一个类的子类,传入的两个参数都是类名

>>> issubclass(B,A)
True

5.1.5 id()和callable()

  • id(): 用于获取对象的内存地址
  • callable():判断对象是否可以被调用。

5.1.6 type()

这个函数在元类中写过了,当传入一个参数时会返回对象的类型,这也是python自省中比较常用的方法

5.2 总结

  • 什么是自省

简单来说就是在程序运行过程中能知道对象类型(还有属性等)的能力

  • python实现自省的方法
方法作用
help()查看函数或模块用途的详细说明
dir()返回对象所有属性
type()查看对象类型
hasattr()查看对象是否有特定属性
getattr()得到对象的特定属性
seetattr()设置对象的特定属性
isinstance()判断一个对象是否是一个已知的类型
issubclass()判断一个类是不是另一个类的子类
id()返回地址值
callable()判断对象是否可调用

参考文章

python面试题

wikipedia Type introspection

Python自省(反射)指南【转】

在这篇文章中说

在笔者,也就是我的概念里,自省和反射是一回事,当然其实我并不十分确定一定以及肯定…

但是我在维基百科看见了这句话

Introspection should not be confused with reflection, which goes a step further and is the ability for a program to manipulate the values, meta-data, properties and/or functions of an object at runtime.

也就是说自省和反射不是同一回事,自省是获取对象类型的能力,而反射是操纵对象的值,元数据,属性和/或函数的能力

Python常用的自省函数

Python-自省机制

Python自省

菜鸟教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457599.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vb.net 窗体接收键盘事件_(十五)C#WinFrom自定义控件系列-键盘(二)

前提入行已经7,8年了&#xff0c;一直想做一套漂亮点的自定义控件&#xff0c;于是就有了本系列文章。本系列文章将讲解各种控件的开发及思路&#xff0c;欢迎各位批评指正。此系列控件开发教程将全部在原生控件基础上进行重绘开发&#xff0c;目标的扁平化、漂亮、支持触屏。如…

centos下cmake安装

步骤一、安装gcc等必备程序包&#xff08;已安装则略过此步&#xff0c;用gcc -v检测&#xff09; yum install -y gcc gcc-c make automake 步骤二、安装wget &#xff08;已安装则略过此步&#xff09; yum install -y wget 步骤三、获取CMake源码包 wget http://www.cmake.…

python 生成式,迭代器,生成器

DAY 6. 生成式,迭代器&#xff0c;生成器 6.1 生成式 6.1.1 列表生成式 list [index for index in range(10)]6.1.2 字典生成式 dict {zhangsan: 10,lisi: 12,wangwu: 18 } # 实现键值互换 dict {k:v for v,k in dict.items() if k > 12}6.1.3 集合生成式 # 100以内…

shell MAC 地址 校验

/**************************************************************************************** shell MAC 地址 校验* 说明&#xff1a;* 要对MAC地址进行校验&#xff0c;记录一下正则表达式写法&#xff0c;有些方法在PC上验证是可行的&…

移动端Web开发如何处理横竖屏

<!Doctype html> <html> <head> <meta charset"utf-8"> <meta id"viewport" name"viewport" content"widthdevice-width,initial-scale1.0;"> <title>横竖屏切换检测</title> <style ty…

恩智浦智能车大赛2020_内蒙古科技大学第九届智能车大赛校内公开赛总决赛

为了激发学生的创新意识&#xff0c;提高学生的动手能力&#xff0c;培养团队合作意识&#xff0c;秉承“实践源于真知&#xff0c;创新放飞梦想”的思想。2020年12月6日&#xff0c;内蒙古科技大学第九届智能车大赛总决赛如约而至。本次大赛有来自各院系的223支队伍报名参加了…

python格式化字符串的三种方法(%,format,f-string)

DAY 7. 格式化字符串 到目前为止&#xff0c;我所知道的&#xff0c;python格式化字符串有三种方法&#xff0c;第一是早期就有的%&#xff0c;其次是2.5之后的format(),还有就是3.6添加的f字符串调试 7.1 %格式化字符串 %格式化字符串是python最早的&#xff0c;也是能兼容…

Android App 优化之 ANR 详解

为了便于阅读, 应邀将Android App性能优化系列, 转移到掘金原创上来.掘金的新出的"收藏集"功能可以用来做系列文集了. 今天先来聊聊ANR. 1, 你碰到ANR了吗 在App使用过程中, 你可能遇到过这样的情况: 恭喜你, 这就是传说中的ANR. 1.1 何为ANR ANR全名Application Not…

微信高级群发接口正文乱码解决方案

content里面的内空如果含有html标签的话&#xff0c;需要对内容进行一下转义。如果里面含有style".."类似于这样的带""号的内容的话&#xff0c;就更需要注意了。 foreach ($news as &$item) {foreach ($item as $key > $val){if ($key content){$…

python *args和**kwargs以及序列解包

DAY 8. *args和**kwargs *args&#xff1a;多值元组&#xff0c;**kwargs多值字典&#xff0c;他们是python函数传参时两个特殊的参数&#xff0c;args和kwargs并不是强制的&#xff0c;但习惯使用这两个&#xff0c;如果在函数参数列表中声明了*args&#xff0c;则允许传递任…

解读直播连麦与点播加密

近年来&#xff0c;直播热潮持续升温。有需求就会有变革&#xff0c;直播的相关技术也在不断更新&#xff0c;为直播行业带来更好地服务。如&#xff1a;直播连麦与点播加密技术等。 直播连麦&#xff0c;即主播与连麦者通过互动直播中心进行实时互动&#xff0c;信息在云端混流…

血红蛋白判断access程序答案_普渡大学开发智能手机应用程序 帮助评估贫血症情况...

医生诊断贫血疾病的方法之一&#xff0c;就是通过观察患者的眼皮&#xff0c;判断眼皮是否发红&#xff0c;从而判断红细胞的数量。但对医生来说&#xff0c;面临的挑战是&#xff0c;这种简单的测试不够精确&#xff0c;无法不从患者身上抽取血样就能给出诊断。美国普渡大学的…

学习笔记:AC自动机

话说AC自动机有什么用......我想要自动AC机 AC自动机简介&#xff1a; 首先简要介绍一下AC自动机&#xff1a;Aho-Corasick automation&#xff0c;该算法在1975年产生于贝尔实验室&#xff0c;是著名的多模匹配算法之一。一个常见的例子就是给出n个单词&#xff0c;再给出一段…

python闭包和装饰器

DAY 9. 闭包和装饰器 9.1 闭包 闭包就是内部函数对外部函数作用域内变量的引用 可以看出 闭包是针对函数的&#xff0c;还有两个函数&#xff0c;内部函数和外部函数闭包是为了让内部函数引用外部函数作用域内的变量的 我们先写两个函数 def fun1():print("我是fun1&q…

学历是铜牌,能力是银牌,人脉是金牌,思维是王牌

有人工作&#xff0c;有人上学&#xff0c;大家千万不要错过这篇文章&#xff0c;能看到这篇文章也是一种幸运&#xff0c;真的受益匪浅&#xff0c;对我有很大启迪&#xff0c;这篇文章将会改变你我的一生&#xff0c;真的太好了&#xff0c;希望与有缘人分享&#xff0c;也希…

石头剪刀布python编程_《python核心编程第二版》练习题——游戏:石头剪刀布

习题里比较有意思的一个题目&#xff0c;实现石头剪刀布这个游戏&#xff0c;起初设计的时候走弯路了(主要时被习题里那个“尽量少用if判断”给整晕了)&#xff0c;想的太复杂&#xff0c;后来发现其实非常简单&#xff0c;完全可以不写if语句。还是枚举法&#xff1a;#! /usr/…

SpringMvc面试题

f-sm-1. 讲下SpringMvc和Struts1,Struts2的比较的优势 性能上Struts1>SpringMvc>Struts2 开发速度上SpringMvc和Struts2差不多,比Struts1要高f-sm-2. 讲下SpringMvc的核心入口类是什么,Struts1,Struts2的分别是什么 SpringMvc的是DispatchServlet,Struts1的是ActionServl…

python 鸭子类型

DAY 10. 鸭子类型 这个概念来源于美国印第安纳州的诗人詹姆斯惠特科姆莱利&#xff08;James Whitcomb Riley,1849-1916&#xff09;的诗句&#xff1a;”When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.”…

thinkphp一句话疑难解决笔记

URL_PATHINFO_DEPR, depr表示 网页路径"分隔符",用"-", 有利于seo,注意是从 sername/index.php(开始的)/home-user-login-var-value开始的,pathinfo也支持普通的参数传值(仅仅支持参数...). 在thinkphp中,有两个地方使用depr,另一个就是tpl的文件目录组织分…

python选取特定行_pandas.DataFrame选取/排除特定行的方法

pandas.DataFrame选取特定行使用Python进行数据分析时&#xff0c;经常要使用到的一个数据结构就是pandas的DataFrame&#xff0c;如果我们想要像Excel的筛选那样&#xff0c;只要其中的一行或某几行&#xff0c;可以使用isin()方法&#xff0c;将需要的行的值以列表方式传入&a…