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属性

# 双下划线开头的类属性 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)  # 10
# print(a.__dict__)

del a.gender
del a.age

print(a.gender)  # gender属性不存在
print(a.age)  # age属性不存在

4.继承方式包装

包装:python为大家提供了标准数据类型,以及丰富的内置方法,其实在很多场景下我们都需要基于标准数据类型来定制我们自己的数据类型,新增/改写方法,这就用到了我们刚学的继承/派生知识(其他的标准类型均可以通过下面的方式进行二次加工)

#  二次加工标准类型(包装)
class List(list):
    def append(self, item):
        if isinstance(item, str):
            super().append(item)
        else:
            print("只能加字符串")

l = List("helloworld")
l.append("111")
l.append(111)  # 只能加字符串

print(l)

5.组合方式授权

授权:授权是包装的一个特性, 包装一个类型通常是对已存在的类型的一些定制,这种做法可以新建,修改或删除原有产品的功能。其它的则保持原样。授权的过程,即是所有更新的功能都是由新类的某部分来处理,但已存在的功能就授权给对象的默认属性。

实现授权的关键点就是覆盖__getattr__方法

原文地址:https://www.cnblogs.com/icemonkey/p/10454207.html

时间: 2024-08-03 22:47:52

python 反射 动态导入模块 类attr属性的相关文章

Python importlib(动态导入模块)

使用 Python importlib(动态导入模块) 可以将字符串型的模块名导入 示例: import importlib module = 'module name' # 字符串型模块名 test = importlib.import_module(module) # 导入模块 print(test.Class().attr) # 打印 Class 类的 attr 属性 原文地址:https://www.cnblogs.com/dbf-/p/10667248.html

python中动态导入模块

如果导入的模块不存在,Python解释器会报 ImportError 错误: >>> import something Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named something 有的时候,两个不同的模块提供了相同的功能,比如 StringIO 和 cStringIO 都提供了Strin

七. 使用反射动态导入模块

一 .动态导入模块 # 利用反射动态导入模块 执行模块中的函数 imp = input("请输入你想导入的模块名:") CC = __import__(imp) # 這种方式就是通过输入字符串导入你所想导入的模块 CC.f1() # 执行模块中的f1方法 print("******************************************") imp = input("请输入模块:") dd = __import__(imp) #

python26 封装 多态 常用的内置函数 `__str__` `__del__` 反射 动态导入模块

今日内容: 1. 封装 2.多态 3. 常用的内置函数 `__str__ `__del__` 4.反射 5.动态导入模块 #1. 封装 ##1.1 什么是封装 ?(what) 对外部隐藏内部的属性,以及实现细节  , 给外部提供使用的接口 注意:封装有隐藏的意思,但不是单纯的隐藏 1.2学习封装的目的. 就是为了能够限制外界对内部数据的访问 1.3python中属性的权限分为两种 1.公开的 ?           没有任何限制 谁都能访问 2.私有的 ?          只有当前类本身能够访

反射 动态导入 元类

isinstance(obj cls) 检查obj是否是cls的对象 issubclass(sub, super) 检测sub是否是super的派生类/子类 class Foo(object): pass obj = Foo() print(isinstance(obj, Foo)) # True class Fo(Foo): pass print(issubclass(Fo, Foo)) #True 反射 reflect python中 反射是指 通过字符串的形式来操作对象的相关属性 geta

Python动态导入模块

如果导入的模块不存在,Python解释器会报 ImportError 错误: >>> import something Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: No module named something 有的时候,两个不同的模块提供了相同的功能,比如 StringIO 和 cStringIO 都提供了Strin

Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)

实现接口类的两种方式 方式一 from abc import ABCMeta from abc import abstractmethod class BaseMessage(metaclass=ABCMeta): @abstractmethod def send(self,subject,body,to,name): pass 方式二 class BaseMessage(object): def send(self, subject, body, to, name): raise NotImp

Python随心记--反射、动态导入模块

hasatttr(object,name) #检测对象中是否存在name属性getattr(object,name,delault = Null)setattr(object,x,True)delattr(object,x) #删除属性 class BlackMedium: feture = 'Ugly' def __init__(self,name,addr): self.name = name self.addr = addr def sell_hourse(self): print('[%

Python 动态导入模块

动态导入模块 目录结构: zhangsandeMacBook-Air:1110 zhangsan$ tree . . ├── lib │   └── aa.py ├── test1.py lib目录下有一个aa.py文件,其中C类中有一个属性name: class C: def __init__(self): self.name = 'zhangsan' 在test1.py文件中需要动态导入aa这个模块有两种办法: 第一种: lib = __import__('lib.aa') obj = li