首页 > 其他分享 >反射、内置方法

反射、内置方法

时间:2022-11-05 22:31:19浏览次数:41  
标签:__ 反射 内置 name ... 对象 self 方法 age

反射

python是动态语言,而反射(reflection)机制被视为动态语言的关键。

反射机制指的是在程序的运行状态中

对于任意一个类,都可以知道这个类的所有属性和方法;

对于任意一个对象,都能够调用他的任意方法和属性。

这种动态获取程序信息以及动态调用对象的功能称为反射机制。

在python中实现反射非常简单,在程序运行过程中,如果我们获取一个不知道存有何种属性的对象,若想操作其内部属性,可以先通过内置函数dir来获取任意一个类或者对象的属性列表,列表中全为字符串格式

class People:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gende = gender

obj = People('egon', 18, 'male')
a = dir(obj)
print(a)

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__',
'__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'gender', 'name']

接下来就是想办法通过字符串来操作对象的属性了,这就涉及到内置函数hasattr、getattr、setattr、delattr的使用了(Python中一切皆对象,类和对象都可以被这四个函数操作,用法一样)

class Teacher:
def __init__(self,full_name):
self.full_name =full_name

t=Teacher('Egon Lin')

# hasattr(object,'name')
hasattr(t,'full_name') # 按字符串'full_name'判断有无属性t.full_name

# getattr(object, 'name', default=None)
getattr(t,'full_name',None) # 等同于t.full_name,不存在该属性则返回默认值None

# setattr(x, 'y', v)
setattr(t,'age',18) # 等同于t.age=18

# delattr(x, 'y')
delattr(t,'age') # 等同于del t.age

基于反射可以十分灵活地操作对象的属性,比如将用户交互的结果反射到具体的功能执行

>>> class FtpServer:
... def serve_forever(self):
... while True:
... inp=input('input your cmd>>: ').strip()
... cmd,file=inp.split()
... if hasattr(self,cmd): # 根据用户输入的cmd,判断对象self有无对应的方法属性
... func=getattr(self,cmd) # 根据字符串cmd,获取对象self对应的方法属性
... func(file)
... def get(self,file):
... print('Downloading %s...' %file)
... def put(self,file):
... print('Uploading %s...' %file)
...
>>> server=FtpServer()
>>> server.serve_forever()
input your cmd>>: get a.txt
Downloading a.txt...
input your cmd>>: put a.txt
Uploading a.txt...

内置方法

Python的Class机制内置了很多特殊的方法来帮助使用者高度定制自己的类,这些内置方法都是以双下划线开头和结尾的,会在满足某种条件时自动触发,我们以常用的__str__和__del__为例来简单介绍它们的使用。

​__str__方法会在对象被打印时自动触发,print功能打印的就是它的返回值,我们通常基于方法来定制对象的打印信息,该方法必须返回字符串类型

>>> class People:
... def __init__(self,name,age):
... self.name=name
... self.age=age
... def __str__(self):
... return '<Name:%s Age:%s>' %(self.name,self.age) #返回类型必须是字符串
...
>>> p=People('lili',18)
>>> print(p) #触发p.__str__(),拿到返回值后进行打印
<Name:lili Age:18>

​__del__会在对象被删除时自动触发。由于Python自带的垃圾回收机制会自动清理Python程序的资源,所以当一个对象只占用应用程序级资源时,完全没必要为对象定制__del__方法,但在产生一个对象的同时涉及到申请系统资源(比如系统打开的文件、网络连接等)的情况下,关于系统资源的回收,Python的垃圾回收机制便派不上用场了,需要我们为对象定制该方法,用来在对象被删除时自动触发回收系统资源的操作

class MySQL:
def __init__(self,ip,port):
self.conn=connect(ip,port) # 伪代码,发起网络连接,需要占用系统资源
def __del__(self):
self.conn.close() # 关闭网络连接,回收系统资源

obj=MySQL('127.0.0.1',3306) # 在对象obj被删除时,自动触发obj.__del__()

反射、内置方法_系统资源

标签:__,反射,内置,name,...,对象,self,方法,age
From: https://blog.51cto.com/u_15222272/5826244

相关文章

  • 关于个人博客部署所遇到的问题和解决方法
    无法获取服务器上的redis可以重装redis可参考文章: (70条消息)Ubuntu安装redis详细教程_普通网友的博客-CSDN博客_ubuntu安装redis安装redis过程:sudoapt-getautoremov......
  • 绑定方法与非绑定方法
    绑定方法与非绑定方法类中定义的函数分为两大类:绑定方法和非绑定方法其中绑定方法又分为绑定到对象的对象方法和绑定到类的类方法。在类中正常定义的函数默认是绑定到对象......
  • Java获取目录下的文件你知道是用哪个方法吗
    Java获取目录下的文件你知道是用哪个方法吗Java的文件操作模块也是一个重要的模块,当初学Java的文件操作的时候一头雾水,觉得很难,现在复盘一下,巩固一下文件操作的知识,没准有......
  • 动静态方法与继承
    目录一.动静态方法二.面向对象之继承的概念1.继承的含义2.继承的目的3.继承实操4.继承的本质三.名字的查找顺序1.不继承情况下名字的查找顺序2.单继承情况下名字的查找顺序......
  • wait和notify方法的使用
    wait和notify方法用来实现一个线程需要等待另一个线程的执行结果的场景。wait:让当前线程在Monitor对象上等待,变成Waiting状态notify:唤醒Monitor对象上等待的一个线程......
  • Collection 常用方法
          ......
  • 解决小程序中textarea ios端样式不兼容的两种方法
    今天遇到在小程序里面textarea会存在一定的兼容性问题,textarea有默认的内边距,在安卓手机和ios手机显示的时候,ios手机的内边距会比安卓手机的内边距大很多,所以会造成样式不兼......
  • Zabbix 5.0 监控 SQLSERVER的配置方法
    0x01环境说明zabbix server5.0  zabbixagent25.0.28windowsserver2019  防火墙已关闭,也可开启放行相关端口SQLSERVER2016 0x02配置准备freetds......
  • MacOS13系统升级动态壁纸无法安装解决方法
    MacOS13系统升级,导致网站上的壁纸无法双击安装,怎么办?这里小编为大家带来了解决方法,一起来看看!网站上下载的壁纸安装包打开,双击安装没有反应键盘上按住shiftcommand.三个键,找......
  • .net 反射简单介绍
    1.什么是反射反射是.NET中的重要机制,通过反射,可以在运行时获得程序或程序集中每一个类型(包括类、结构、委托、接口和枚举等)的成员和成员的信息。有了反射,即可对每一个类型......