码迷,mamicode.com
首页 > 编程语言 > 详细

python 反射 动态导入模块 类attr属性

时间:2019-03-01 00:22:20      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:关键点   授权   obj   默认   app   功能   client   函数   init   

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__方法

 

python 反射 动态导入模块 类attr属性

标签:关键点   授权   obj   默认   app   功能   client   函数   init   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!