Python 基础 三 反射
Python 基础 三 反射
今天我们先介绍一下反射这个概念,啥是反射?反射就是自己检测自己。在我们Python的面向对象中的反射是啥意思呢?就是通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)
在Python中四个产生反射的函数,分别是:hasattr();getattr();setattr();delattr();
下列方法适用于类和对象(一切皆对象,类本身也是一个对象)
- hasattr((object, name, default=None))
- 判断object中有没有一个name字符串对应的方法或属性
- def getattr(object, name, default=None): # known special case of getattr
- """
- getattr(object, name[, default]) -> value
- Get 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't
- exist; without it, an exception is raised in that case.
- """
- pass
- getattr(object, name, default=None)
- 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''
- """
- pass
- setattr(x, y, v)
- def delattr(x, y): # real signature unknown; restored from __doc__
- """
- Deletes the named attribute from the given object.
- delattr(x, 'y') is equivalent to ``del x.y''
- """
- pass
- delattr(x, y)
四种方法的演示:
- class BlackMedium:
- feature='Ugly'
- def __init__(self,name,addr):
- self.name=name
- self.addr=addr
- def sell_house(self):
- print('%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不傻逼' %self.name)
- def rent_house(self):
- print('%s 黑中介租房子啦,傻逼才租呢' %self.name)
- b1=BlackMedium('万成置地','回龙观天露园')
- #检测是否含有某属性
- print(hasattr(b1,'name'))
- print(hasattr(b1,'sell_house'))
- #获取属性
- n=getattr(b1,'name')
- print(n)
- func=getattr(b1,'rent_house')
- func()
- # getattr(b1,'aaaaaaaa') #报错
- print(getattr(b1,'aaaaaaaa','不存在啊'))
- #设置属性
- setattr(b1,'sb',True)
- setattr(b1,'show_name',lambda self:self.name+'sb')
- print(b1.__dict__)
- print(b1.show_name(b1))
- #删除属性
- delattr(b1,'addr')
- delattr(b1,'show_name')
- delattr(b1,'show_name111')#不存在,则报错
- print(b1.__dict__)
- 四个方法的使用演示
为啥要使用反射机制呢?
好处一:实现可插拔机制(就是你与一个人一起开发一个项目若一个人暂时有时不能做他自己负责的项目但你要使用调用他的某些功能,so ,你就可以使用这个反射拉)
总之反射的好处就是,可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定’,什么意思?即你可以事先把主要的逻辑写好(只定义接口),然后后期再去实现接口的功能
好处二:动态导入模块(基于反射当前模块成员)
- # from m1 import t
- # t.test1()
- module_t = __import__('m1.t') # 实质只是导入了最顶层的那个模块m1
- print(module_t) # <module 'm1' from 'C:\\Users\\lenovo\\Desktop\\Py_fullstack_s4\\pythonday15\\m1\\__init__.py'>
- # module_t.test1() #AttributeError: module 'm1' has no attribute 'test1'
- # module_t.t.test1()
- import importlib
- m = importlib.import_module('m1.t') # <module 'm1.t' from 'C:\\Users\\lenovo\\Desktop\\Py_fullstack_s4\\pythonday15\\m1\\t.py'>
- print(m)
- m.test1()
- m._test2() #只有 import * 的时候才是导入会报错误
二、__setattr__;__getattr__;__delattr__;的使用
- class Foo:
- x=1
- def __init__(self,y):
- self.y=y
- def __getattr__(self, item):
- print('----> from getattr:你找的属性不存在')
- def __setattr__(self, key, value):
- print('----> from setattr')
- # self.key=value #这就无限递归了,你好好想想
- # self.__dict__[key]=value #应该使用它
- def __delattr__(self, item):
- print('----> from delattr')
- # del self.item #无限递归了
- self.__dict__.pop(item)
- #__setattr__添加/修改属性会触发它的执行
- f1=Foo(10)
- print(f1.__dict__) # 因为你重写了__setattr__,凡是赋值操作都会触发它的运行,你啥都没写,就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值
- f1.z=3
- print(f1.__dict__)
- #__delattr__删除属性的时候会触发
- f1.__dict__['a']=3#我们可以直接修改属性字典,来完成添加/修改属性的操作
- del f1.a
- print(f1.__dict__)
- #__getattr__只有在使用点调用属性且属性不存在的时候才会触发
- f1.xxxxxx
三种方法的使用
Python 基础 三 反射的更多相关文章
- 进击的Python【第三章】:Python基础(三)
Python基础(三) 本章内容 集合的概念与操作 文件的操作 函数的特点与用法 参数与局部变量 return返回值的概念 递归的基本含义 函数式编程介绍 高阶函数的概念 一.集合的概念与操作 集合( ...
- Python基础之反射
python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...
- python基础(14)-反射&类的内置函数
反射 几个反射相关的函数可参考python基础(10)-匿名函数&内置函数中2.2.4反射相关 类的一些内置函数 __str__()&__repr__() 重写__str__()函数类 ...
- python基础-9__import__ 反射和面向对象基础 self 封装 继承(多继承顺序) 多态
一 反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...
- Python基础(三)——集合、有序 无序列表、函数、文件操作
1.Set集合 class set(object): """ set() -> new empty set object set(iterable) -> n ...
- Python 基础三 文件 函数
今天回顾一下之前学的文件操作相关知识点,对于文件的操作,主要有一下几部分构成: 一.文件的基础知识 1.文件操作的基本流程 文件操作其实可以分成三大部分: 1.打开文件,获取文件句柄并赋予一个变量 2 ...
- python基础之反射内置方法元类
补充内置函数 isinstance(obj,Foo) # 判断obj是不是foo的实例 issubclass() # 判断一个类是不是另一个类的子类 反射 什么是反射? 通过字符串来操作 ...
- python基础三
多级菜单 多级菜单 可依次选择进入各子菜单 所需新知识点:列表.字典 #!/usr/bin/env python # -*- coding: utf-8 -*- menu = { '北京':{ '海淀 ...
- Python基础三. 函数、lambda、filter、map、reduce
一.概述 函数, 就是用一些语句组织起来实现一组特定的功能, 用来重复调用. 函数的作用及意义:最大化的重用代码和最小化的代码冗余以及对流程的分解. Python中有哪些函数: 内建的函数 第三方模块 ...
随机推荐
- 告诉你如何回答"线上CPU100%排查"面试问题
不知道在大家面试中,有没有遇到这个问题: 生产服务器上部署了几个java程序,突然出现了CPU100%的异常告警,你如何定位出问题呢? 这个问题分为两版回答!高调版对不起,我是做研发的,这个问题在生产 ...
- drf框架serializers中ModelSerializer类简化序列化和反序列化操作
0905自我总结 drf框架serializers中ModelSerializer类 基于seriallizer类进行简化 https://www.cnblogs.com/pythonywy/p/11 ...
- python selenium鼠标滑动操作
先安装pyautogui: pip install pyautogui #coding=utf-8 import pyautogui from selenium import webdriver fr ...
- 【Medium 万赞好文】ViewModel 和 LIveData:模式 + 反模式
原文作者: Jose Alcérreca 原文地址: ViewModels and LiveData: Patterns + AntiPatterns 译者:秉心说 View 和 ViewModel ...
- 代码审计-MetInfo CMS任意文件读取漏洞
0x01 代码分析 发现在app\system\include\module\old_thumb.class.php疑似有任意文件读取漏洞 public function doshow(){ glob ...
- ssh-keygen创建证书
ssh-keygen安装请参考以下内容:https://blog.csdn.net/a419419/article/details/80021684 (可能我已经安装过git了,所以不需要安装,具体细 ...
- 一个有趣的C语言问题
这个问题是知乎上的一个问题,看了以后觉得比较有意思.代码短到只有十多行,但是这么短的代码却输出了很奇怪的结果.很多人回答的时候都是站在理论的角度上说明代码的问题,但是实际的问题还是没有说明其中的问题. ...
- OpenvSwitch系列之ovs-vsctl命令使用
Open vSwitch系列之一 Open vSwitch诞生 Open vSwitch系列之二 安装指定版本ovs Open vSwitch系列之三 ovs-vsctl 命令使用 OpenvSwit ...
- CentOS6.6-MySQL报Curses library not found
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.40 \> -DMYSQL_DATADIR=/application/mysql-5. ...
- 百万年薪python之路 -- MySQL数据库之 完整性约束
MySQL完整性约束 一. 介绍 为了防止不符合规范的数据进入数据库,在用户对数据进行插入.修改.删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数 ...