gpt4 book ai didi

Python自省及反射原理实例详解

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Python自省及反射原理实例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

Python中的自省与反射 。

  由于Python是一门强类型的动态解释型语言,故我们在某些时候并不会知道(特别是与别人对接开发工作的时候)对象中具有的属性与方法.

  这个时候我们并不能直接通过 .或者查看底层的 __dict__ 方法来获得该对象下的属性与方法,我们需要使用一种更文明的方式来获取该对象下的属性与方法,故这种文明的方式被称之为反射.

  自省和反射是两个比较专业化的术语,首先自省是获取对象的能力,而反射是操纵对象的能力.

  Python中使用delattr()和setattr()实现反射,而其他方法则属于自省.

  反射和自省常常组合使用! 。

  。

Python中关于反射与自省的部分方法 
常用方法
dir() 返回一个列表,存储该对象下能被 . 出的所有属性与方法。
hasattr() 查看对象是否具有某种属性或方法,返回True或者False。
getattr() 获取对象下的某一属性或方法。如被获取对象没有相应的属性或方法,则可以为其设置默认值。
setattr() 设置对象下的某一属性的值,通常我们不会在对象外部为其新增某一方法,而是在在对象的类中进行设置。
delattr() 删除对象中的某一属性或方法。
其他的一些方法 
help() 获取对象的帮助信息,注意。没有返回值!内部会调用print()进行打印操作。
issubclass() 判断一个类是不是另一个类的子类
isinstance() 判断一个对象是否是一个已知的类型
id() 返回存储对象的内存地址编号
callable() 判断对象是否可调用

  。

注意:于一切皆对象的原则,我们不仅可以对实例对象进行自省与反射,也可以对类对象进行自省与反射.

操作演示 。

应用场景 。

  。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# ==== 这样做的好处是即使用户输入有误,也不会抛出异常 ====
 
import sys
 
class DownloadAndUpload( object ):
 
   def __init__( self ):
     self .val = sys.argv[ 1 ]
     self .select()
 
   def download( self ):
     print ( "正在下载..." )
 
   def upload( self ):
     print ( "正在上传..." )
 
   def select( self ):
     if hasattr ( self , self .val):
       getattr ( self , self .val)()
     else :
       print ( "没有该方法" )
DownloadAndUpload()

Python自省及反射原理实例详解

扩展与后言:反射内部实现机制 。

其实我想了好一会要不要写这个,内部实现机制。这一些内容应该放在双下方法学完之后才应该讲反射实现的内部机制。所以这里提一嘴:

  • hasattr() : __getattribute__ 有则返回,无则捕捉异常返回False。
  • getattr() :这个应该是在描述符之后进行讲解,实际上还是对__dict__进行操作。
  • setattr() : 调用内部__setattr__ 对 __dict__ 进行操作。Ps:实例对象调用时检查其类及其父类,类对象调用时检查其父类或者元类。
  • delattr() :调用__delattr__ 对 __dict__ 进行操作。Ps:实例对象调用时检查其类及其父类,类对象调用时检查其父类或者元类。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

原文链接:https://www.cnblogs.com/Yunya-Cnblogs/p/13114684.html 。

最后此篇关于Python自省及反射原理实例详解的文章就讲到这里了,如果你想了解更多关于Python自省及反射原理实例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com