python基础27——反射&内置方法

反射

什么是反射?

指的是在程序运行过程中可以"动态(不见棺材不掉泪)"获取对象的信息

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

什么是反射机制?

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

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

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

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

如何实现反射?

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

def say(self):
  print(‘<%s:%s>‘ %(self.name,self.age))

  obj=People(‘辣白菜同学‘,18)

实现反射机制的步骤

1、先通过多dir:查看出某一个对象下可以.出哪些属性来
  print(dir(obj))

>>> class People:
...     def __init__(self,name,age,gender):
...         self.name=name
...         self.age=age
...         self.gender=gender
...
>>> obj=People(‘egon‘,18,‘male‘)
>>> dir(obj) # 列表中查看到的属性全为字符串
[......,‘age‘, ‘gender‘, ‘name‘]

2、可以通过字符串反射到真正的属性上,得到属性值
  print(obj.__dict__[dir(obj)[-2]])

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

四个内置函数的使用:通过字符串来操作属性值

1、hasattr(object,name)        检测是否含有某属性

判断object中有没有一个name字符串对应的方法或属性

print(hasattr(obj,‘name‘))
 print(hasattr(obj,‘x‘))

2、getattr(object, name, default=None)      获取属性

print(getattr(obj,‘name‘))

3、setattr(x,y,v)     设置属性

setattr(obj,‘name‘,‘EGON‘)           # obj.name=‘EGON‘
 print(obj.name)

4、delattr(x,y)    删除属性

delattr(obj,‘name‘) # del obj.name
 print(obj.__dict__)

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

>>> 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...

内置方法

1、什么是内置方法?

定义在类内部,以__开头并以__结果的方法
特点:会在某种情况下自动触发执行

2、为何要用内置方法?

为了定制化我们的类or对象

3、如何使用内置方法

 __str__:在打印对象时会自动触发,然后将返回值(必须是字符串类型)当做本次打印的结果输出

>>> 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 People:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.x = open(‘a.txt‘,mode=‘w‘)
        # self.x = 占据的是操作系统资源

    def __del__(self):
        # print(‘run...‘)
        # 发起系统调用,告诉操作系统回收相关的系统资源
        self.x.close()

obj = People(‘辣白菜同学‘, 18)
# del obj # obj.__del__()
print(‘============>‘)

原文地址:https://www.cnblogs.com/lucky-cat233/p/12706775.html

时间: 2024-08-14 19:37:12

python基础27——反射&内置方法的相关文章

[python] 类常用的内置方法

内置方法 说明 __init__(self,...) 初始化对象,在创建新对象时调用 __del__(self) 释放对象,在对象被删除之前调用 __new__(cls,*args,**kwd) 实例的生成操作 __str__(self) 在使用print语句时被调用 __getitem__(self,key) 获取序列的索引key对应的值,等价于seq[key] __len__(self) 在调用内联函数len()时被调用 __cmp__(stc,dst) 比较两个对象src和dst __ge

Python 教程——String的内置方法

Python为String类型提供了很多很有用的内置方法,这篇文章主要针对Python2.7的内置方法做一个测试列举,展示一下用途. 如果大家想看原版的,可以去这个网址看(https://docs.python.org/2/library/stdtypes.html#string-methods),但是这里是我自己的实践以及一些理解. 1. str.capitalize() 返回第一个字母大写的str str = "a string" str.capitalize()'A string

反射 内置方法

# isinstance()判断对象所属类型,包括继承关系 判断对象# class A:pass# class B(A):pass# b=B()# print(isinstance(b,B))# b属于 B# print(isinstance(b,A))# b属于 A##ssubclass() 判断类与类之间的继承关系# class A:pass# class B(A):pass# print(issubclass(B,A))# b属于 B# print(issubclass(A,B))# A不

python中字符串的内置方法

这里说的是字符串中的内置方法,毕竟字符串是最常用的操作对象. ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__le

【Python】Java程序员学习Python(四)— 内置方法和内置变量

<假如爱有天意> 当天边那颗星出现,你可知我又开始想念,有多少爱恋只能遥遥相望,就像月光洒向海面,年少的我们曾以为,相爱的人就能到永远,当我们相信情到深处在一起,听不见风中的叹息,谁知道爱是什么,短暂的相遇却念念不忘,用尽一生的时间,竟学不会遗忘,如今我们已天各一方,生活的像周围人一样,眼前人给我最信任的依赖,但愿你被温柔对待,多少恍惚的时候,仿佛看见你在人海川流,隐约中你已浮现,一转眼又不见,短暂的相遇却念念不忘,多少恍惚的时候,仿佛看见你在人海川流,隐约中你已浮现,一转眼又不见,当天边那颗

python中的字典内置方法小结

#!/usr/local/bin/python3 # -*- coding:utf-8 -*- #key-value #dict 无序,无下标,不需要下标,因为有key stu={ 'stu001':"zhang yu", 'stu002':"ma hong yan", 'stu003':"zhang guo bin", 'stu004':"sha chun hua" } ''' -----------------------

python基础—lambda、内置函数、三元函数(深入学习)

一. 三元运算 例: 二. Lamdba表达式 例: 三. 内置函数 1. 高级函数: 1)Map(函数名,参数):使用函数遍历参数,并显示每个参数的结果 2)Reduce(函数名,参数):使用函数依次遍历参数,但至少两个参数 3)Filter(函数名,参数):调用函数,遍历参数,只有返回True的结果 4)Zip(序列A,序列B*****):接收多个序列化类型的数据,对各序列化数据中的元素, 按索引位置分类成一个个元组,元组的个数以元素最少的序列为准,以列表的方式显示. 2. 其他函数

Python进阶-----类的内置方法__getattribute__

__getattribute__ 方法功能: 1 调用属性会触发该功能,属性存在则会返回相应的值:2 如果属性不存在则会抛出异常AttributeError,所以可以自定义异常信息3 存在__getattr__,若有异常出现则会传递给__getattr__用来接收,执行操作 class Foo: def __init__(self,x): self.x=x def __getattr__(self, item): print('执行的是我') # return self.__dict__[ite

python集合操作和内置方法

一 集合基本介绍 集合:在{}内用逗号隔开每个值,集合的特点: 每个值必须是不可变类型 集合是无序的 集合的值不能重复 集合的应用场景较少,最重要的应用场景为进行关系运算以及去重. 二 集合的操作 1 求两个集合的交集 set1 = {1,2,3,4,'a','b','c','d'} set2 = {4,5,6,7,'c','d','e','f'}print(set1 & set2) # 输出结果为 (4,'c','d') 2 求两个集合的并集 set1 = {1,2,3,4,'a','b','