反射

反射:通过字符串来映射到对象的属性

class People():
def __init__(self, name, age):
self.name = name
self.age = age def talk(self):
print('Name:%s,Age:%s' % (self.name, self.age)) p = People('ysg', 21) # 判断 对象 中是否存在该属性,实际判断的是 p.__dict__ ['name']
print(hasattr(p, 'name')) # 结果:True # 取到 'name' 中的值
print(getattr(p, 'name', None)) # 结果:ysg
print(getattr(p, 'names', None)) # 结果:None
print(getattr(p, 'talk', None)) # <bound method People.talk of <__main__.People object at 0x0000020EDF705278>> # 修改 'name' 中的值
setattr(p, 'name', 'ysging') # p.name = 'ysging'
print(p.name) # 结果:ysging # 删除 'name' 对象
delattr(p, 'age') # del p.age
print(p.__dict__) # 结果:{'name': 'ysging'}

有这样的需求:希望通过用户的输入内容来调用方法

例子

class People():
def __init__(self, name, age):
self.name = name
self.age = age def run(self):
while 1:
val = input('>>>')
if hasattr(self, val):
func = getattr(self, val, None)
func()
def talk(self):
print('Name:%s,Age:%s' % (self.name, self.age)) p = People('ysg', 21)
p.run() # 结果
# >>>talk
# Name:ysg,Age:21

反射的好处:

好处一:实现可插拔机制

有俩程序员,一个lili,一个是egon,lili在写程序的时候需要用到egon所写的类,但是egon去跟女朋友度蜜月去了,还没有完成他写的类,lili想到了反射,使用了反射机制lili可以继续完成自己的代码,等egon度蜜月回来后再继续完成类的定义并且去实现lili想要的功能。

总之反射的好处就是,可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定’,什么意思?即你可以事先把主要的逻辑写好(只定义接口),然后后期再去实现接口的功能

好处二:动态导入模块(基于反射当前模块成员)

内置方法

isinstance(obj,cls) 检查是否 obj 是否是类 cls 的对象

class Foo():
pass obj = Foo()
g = 123
print(isinstance(obj, Foo)) # True
print(isinstance(g, Foo)) # False

issubclass(sub, super) 检查 sub 类是否是 super 类的派生类

class Foo():
pass class A(Foo):
pass class B():
pass print(issubclass(A, Foo)) # True
print(issubclass(B, Foo)) # False

item 系列:把对象做成像字典的类型

class Foo():
def __init__(self, name):
self.name = name def __getitem__(self, item):
print('getitem...')
return self.__dict__.get(item) def __setitem__(self, key, value):
print('setitem...')
print(key,value) # name ysging
self.__dict__[key] = value def __delitem__(self, key):
del self.__dict__[key] f = Foo('ysg')
print(f.__dict__) # {'name': 'ysg'} # 取值
print(f['name']) # ysg # 设置
f['name'] = 'ysging'
print(f.name) # ysging # 删除
del f['name']
print(f.__dict__) # {}

__str__

一般情况下打印出为内存地址

class People():
def __init__(self, name, age):
self.name = name
self.age = age p = People('ysg', 22)
print(p) # <__main__.People object at 0x000002C168D952E8>

使用 __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('ysg', 22)
print(p) # <name:ysg,age:22>

__del__:如果在类内部定义了一个 __del__ 方法,则会在对象被删除的时候先自动触发这个方法,再把对象删掉

python只会回收对象本身的资源,不会回收与对象相关的数据

class Open():
def __init__(self,file):
print('open file...')
self.file = file def __del__(self):
print('回收与对象相关的资源:self.close()') #这里可以写上与对象相关的数据,如:操作系统中的资源 f = Open('config.py')
print('-------main-------')

析构方法,当对象在内存中被释放时,自动触发执行。

注:如果产生的对象仅仅只是python程序级别的(用户级),那么无需定义__del__,如果产生的对象的同时还会向操作系统发起系统调用,即一个对象有用户级与内核级两种资源,比如(打开一个文件,创建一个数据库链接),则必须在清除对象的同时回收系统资源,这就用到了__del__

典型的应用场景:

创建数据库类,用该类实例化出数据库链接对象,对象本身是存放于用户空间内存中,而链接则是由操作系统管理的,存放于内核空间内存中

当程序结束时,python只会回收自己的内存空间,即用户态内存,而操作系统的资源则没有被回收,这就需要我们定制__del__,在对象被删除前向操作系统发起关闭数据库链接的系统调用,回收资源

day 27-1 反射、内置方法的更多相关文章

  1. 多态 鸭子类型 反射 内置方法(__str__,__del__) 异常处理

    ''' 1什么是多态 多态指的是同一种/类事物的不同形态 2 为何要有多态 多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象 多态性的精髓:统一 多态性的好处: 1增加了程序的 ...

  2. python基础之反射内置方法元类

    补充内置函数 isinstance(obj,Foo)   # 判断obj是不是foo的实例 issubclass()      # 判断一个类是不是另一个类的子类 反射 什么是反射? 通过字符串来操作 ...

  3. 27 isinstance与issubclass、反射、内置方法

    isinstance与issubclass issubclass:判断子类是否属于父类,是则返回True,否则返回False isinstance:判断对象是否属于类,是则返回True,否则返回Fal ...

  4. Python之面向对象之反射、内置方法

    一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...

  5. day28 面向对象:反射,内置函数,类的内置方法

    面向对象进阶博客地址链接: http://www.cnblogs.com/Eva-J/articles/7351812.html 复习昨日内容: # 包 # 开发规范 # # hashlib # 登录 ...

  6. 反射与内置方法str del

    1.反射 用字符串来操作类或者对象的属性 class People:# country= 'china'# def __init__(self,name):# self.name= name## de ...

  7. Learning-Python【26】:反射及内置方法

    反射的概念 可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),Python 中一切皆对象,都可以使用反射. 反射有四种方法: hasattr:hasattr(object, n ...

  8. python day21 ——面向对像-反射 getattr,内置方法

    一.反射:用字符串数据类型的变量名来访问这个变量的值 上代码^_^ # class Student: # ROLE = 'STUDENT' # @classmethod # def check_cou ...

  9. python 入门基础21 --面向对象_多态、内置方法、反射

    内容: 1.接口思想 2.抽象类思想 3.多态 4.内置方法 5.反射 1.接口思想 建立关联的桥梁,方便管理代码 接口类:用来定义功能的类,位继承它的子类提供功能 该类的功能方法一般不需要实现体,实 ...

  10. python面向对象 : 反射和内置方法

    一. 反射 1. isinstance()和issubclass() isinstance( 对象名, 类名) : 判断对象所属关系,包括父类  (注:type(对象名) is 类名 : 判断对象所属 ...

随机推荐

  1. pom父工程dependencyManagement中的jar包在子工程中不写版本号无法引入的问题

    1.遇到的问题:  本人用的idea,然后在导入别人的项目的时候,pom文件中没有报错了,但是在maven栏目中jar包却一直报红,是因为我没写版本的原因吗?不对呀,我的父工程下已经写了springb ...

  2. 转:SSL 握手协议详解

    SSL 握手协议详解 RSA作为身份认证,ECDHE来交换加密密钥,AES/DES等作为加密. 如果RSA来加解密,那么身份认证后,直接用认证后的RSA公钥解密.不需要再额外交换加密密钥了. 相关报文 ...

  3. luogu P1082 同余方程 |扩展欧几里得

    题目描述 求关于 x的同余方程 ax≡1(modb) 的最小正整数解. 输入格式 一行,包含两个正整数 a,ba,b,用一个空格隔开. 输出格式 一个正整数 x,即最小正整数解.输入数据保证一定有解. ...

  4. 【解决】http: server gave HTTP response to HTTPS client

    [问题]上传镜像到私有仓库时报错 $ docker push xxx.xxx.xxx.xxx:5000/java-8 The push refers to repository [xxx.xxx.xx ...

  5. BZOJ 1861书架

    小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下一本.由于这些书太有吸引 ...

  6. Java语法进阶14-网络编程

    网络编程 软件结构 C/S结构 :全称为Client/Server结构,是指客户端和服务器结构. B/S结构 :全称为Browser/Server结构,是指浏览器和服务器结构. 网络通信协议 网络通信 ...

  7. 【JS】308- 深入理解ESLint

    点击上方"前端自习课"关注,学习起来~ 本文来自于"自然醒"投稿至[前端早读课]. 小沈是一个刚刚开始工作的前端实习生,第一次进行团队开发,难免有些紧张.在导师 ...

  8. vue 双语言切换中,data内翻译文字不正常切换的解决方案

    背景 有这么一个登录页面,相关功能如下: 支持双语言,点击切换语言 表单内部有一个自定义的select,里面option的label.value都是的名字由外部提供:其中预设的option的label ...

  9. ASP.NET Core Web API 最佳实践指南

    原文地址: ASP.NET-Core-Web-API-Best-Practices-Guide 介绍 当我们编写一个项目的时候,我们的主要目标是使它能如期运行,并尽可能地满足所有用户需求. 但是,你难 ...

  10. Unity各平台宏定义

    属性 方法 UNITY_EDITOR #define directive for calling Unity Editor scripts from your game code. UNITY_EDI ...