python 反射 动态导入模块 类attr属性
1.反射
hasattr getattr delattr setattr
优点:事先定义好接口,接口只有在被完成后才能真正执行,这实现了即插即用,这其实是一种“后期绑定”,即先定义好接口,
然后是再去实现具体的功能
print(hasattr(p, 'age')) # True 是否有属性 判断 print(getattr(p, 'name', '没有找到该参数')) # get属性值
print(getattr(p, 'name1', 'False')) # False setattr(p, 'name', 'sb') # 设置属性
print(p.__dict__) delattr(p, 'name') # 删除属性
print(p.__dict__)
setattr(p, 'func', lambda x: x + 1)
setattr(p, 'func1', lambda self: self.name + " sb")
print(p.__dict__)
print(p.func(100)) # 添加函数属性
setattr(p, 'name', 'wangwu')
print(p.func1(p))
# 反射应用场景
class FtpClient:
#'ftp客户端,但是还么有实现具体的功能'
def __init__(self, addr):
print('正在连接服务器[%s]' % addr)
self.addr = addr from module import FtpClient
f1 = FtpClient('192.168.1.1')
if hasattr(f1, 'get'): # 判断f1是否有get方法 如果没有 就执行else语句
func_get = getattr(f1, 'get')
func_get()
else:
print('---->不存在此方法')
print('处理其他的逻辑')
2.动态导入模块
# 动态导入模块
module__test = __import__('macboy.wsgi') # 此处就是macboy位置
print(module__test) # <module 'macboy' from 'C:\\Disk_D\\pycharm_stu\\macboy\\macboy'> import importlib m = importlib.import_module('macboy.wsgi') # 此处是macboy.wsgi位置
print(m) # <module 'macboy.wsgi' from 'C:\\Disk_D\\pycharm_stu\\macboy\\macboy\\wsgi.py'>
3.类attr属性 __gerattr__ __setattr__ __delattr__ __getattribute__
# 双下划线开头的类属性 obj.属性 触发
class Foo:
def __init__(self, name):
self.name = name # 属性不存在时 被触发 比较常用
def __getattr__(self, item):
return "%s属性不存在" % (item) # 添加属性时 被触发
def __setattr__(self, key, value):
self.__dict__[key] = str(value) # 删除属性时 被触发
def __delattr__(self, item):
self.__dict__.pop(item) a = Foo('wangwu')
print(a.name)
print(a.ww) # ww属性不存在
# print(a.__dict__) a.age = 10
a.gender = 'man'
# print(a.__dict__)
print(dir(Foo))
# print(Foo.__dict__) print(a.gender) # "man"
print(a.age) #
# print(a.__dict__) del a.gender
del a.age print(a.gender) # gender属性不存在
print(a.age) # age属性不存在 # __getattribute 和 __getarr__ 不管找不找的到,都会执行 先前面执行后面后执行 不管是否有偶异常 __getattribute都执行
# 当__getattribute抛出一异常 小弟__getarr__接受到 处理异常
class Foo:
def __init__(self, name):
self.name = name def __getattr__(self, item):
return "你找的%s属性不存在" % (item) def __getattribute__(self, item):
print("执行的是__getattribute")
raise AttributeError("抛出异常") f1 = Foo('fdsf')
print(f1.fdd)
4.继承方式包装
包装:python为大家提供了标准数据类型,以及丰富的内置方法,其实在很多场景下我们都需要基于标准数据类型来定制我们自己的数据类型,新增/改写方法,这就用到了我们刚学的继承/派生知识(其他的标准类型均可以通过下面的方式进行二次加工)
# 二次加工标准类型(包装)
class List(list):
def append(self, item):
if isinstance(item, str):
super().append(item)
else:
print("只能加字符串") l = List("helloworld")
l.append("")
l.append(111) # 只能加字符串 print(l)
5.组合方式授权
授权:授权是包装的一个特性, 包装一个类型通常是对已存在的类型的一些定制,这种做法可以新建,修改或删除原有产品的功能。其它的则保持原样。授权的过程,即是所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性。
实现授权的关键点就是覆盖__getattr__方法
# 组合方式授权
import time
class Open:
def __init__(self, filename, mode='r', encoding='utf-8'):
self.file = open(filename, mode, encoding=encoding)
self.mode = mode
self.encoding = encoding def write(self, line):
t = time.strftime("%Y-%m-%d %X")
self.file.write('%s %s' % (t, line)) def __getattr__(self, item):
# >>> getattr(list,"append")
# <method 'append' of 'list' objects>
return getattr(self.file, item) # file中执行item方法 f1 = Open('a.txt', 'w+')
print(f1.__dict__)
print(dir(f1.file)) f1.write('内存空间不足\n')
f1.write('服务器超载\n')
f1.seek(0)
print(f1.read())
python 反射 动态导入模块 类attr属性的更多相关文章
- Python importlib(动态导入模块)
使用 Python importlib(动态导入模块) 可以将字符串型的模块名导入 示例: import importlib module = 'module name' # 字符串型模块名 test ...
- python importlib动态导入模块
一般而言,当我们需要某些功能的模块时(无论是内置模块或自定义功能的模块),可以通过import module 或者 from * import module的方式导入,这属于静态导入,很容易理解. 而 ...
- python_反射:动态导入模块
官方推荐方法: test_mod.py def hi(): print('Hi') test.py import importlib q = importlib.import_module('test ...
- python中动态导入模块
当导入的模块不存在时,就会报ImportError错误,为了避免这种错误可以备选其他的模块或者希望优先使用某个模块或包,可以使用try...except...导入模块或包的方式. 例如: Python ...
- java利用反射动态获取实体类的属性值
直接贴代码吧,有需要的话,可以根据自己的需要修改部分代码: public BigDecimal getByAttributeName(ThmdGwqriR thmdGwqriR, String att ...
- python动态导入模块——importlib
当在写代码时,我们希望能够根据传入的选项设置,如args.model来确定要导入使用的是哪个model.py文件,而不是一股脑地导入 这种时候就需要用上python的动态导入模块 比如此时文件结构为: ...
- Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
实现接口类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...
- python面向对象反射-框架原理-动态导入-元类-自定义类-单例模式-项目的生命周期-05
反射 reflect 反射(reflect)其实是反省,自省的意思 反省:指的是一个对象应该具备可以检测.修改.增加自身属性的能力 反射:通过字符串获取对象或者类的属性,进行操作 设计框架时需要通过反 ...
- Python 实现抽象类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
实现抽象类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=AB ...
随机推荐
- python GIL(Global Interpreter Lock)
一 介绍 ''' 定义: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple nati ...
- win2003设置单用户登录
远程桌面是windows操作系统中一个很方便的功能,管理测试机资产.异地排除故障等,都很快捷.在windows xp sp2模式下,一般默认是单用户登录,也就是当A用户远程一台机器时,B用户在远程到这 ...
- AES对称加解密
简介设计思想加密模式ECB模式(电子密码本模式:Electronic codebook)CBC模式(密码分组链接:Cipher-block chaining)CFB模式(密文反馈:Cipher fee ...
- spring中排除某个类
在spring中可能需要排除某个类,做法是在spring配置文件中加入如下配置 <context:component-scan base-package="com.ias" ...
- ECharts概念学习系列之ECharts官网教程之自定义构建 ECharts(图文详解)
不多说,直接上干货! 官网 http://echarts.baidu.com/tutorial.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E6%9E%84%E5%BB%BA%2 ...
- JavaScript数据结构-11.散列
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 计算2..n的素数
def check(2) , do: true def check(n) when n >2 do b = for x <- (Enum.into 2..n-1,[]),do: x if ...
- C#(winform)实现不同DPI控件自适应1
1. PicBox控件 顺便一提关键字:stretch [stretʃ] vt. 伸展,张开 //控制pictureBox图片的显示格式 this.picClose.BackgroundImageLa ...
- Logback学习笔记
Logback介绍 Logback 分为三个模块:Core.Classic 和 Access.Core模块是其他两个模块的基础. Classic模块扩展了core模块. Classic模块相当于log ...
- 怎样在 Azure 应用服务中生成和部署 Java API 应用
先决条件 Java 开发人员工具包 8(或更高版本) 已在开发计算机上安装 Maven 已在开发计算机上安装 Git Azure 订阅付费版或试用版 HTTP 测试应用程序,如 Postman 使用 ...