Python全栈之路-Day31
1 反射
反射的精髓是通过字符串去获取对象属性的值
1.1 基于类和对象反射的属性
#!/usr/bin/env python
# __Author__: "wanyongzhen"
# Date: 2017/4/24
# 基于类和对象反射的属性
class People:
country = 'China'
def __init__(self,name):
self.name = name
def run(self):
print('%s is running'%self.name)
p = People('egon') # 实例化一个People对象p
print('基于类和对象反射的属性')
# hasattr: 判断类或对象是否存在某个属性,存在返回True,否则返回False
print('hasattr------------>')
print(hasattr(p,'name'))
print(hasattr(People,'name'))
# getattr: 获取类或对象的属性
print('getattr------------->')
print(getattr(p,'run'))
print(getattr(People,'run'))
func = getattr(p,'run')
func()
# hasattr和getattr结合使用
print('hasattr & getattr------------>')
if hasattr(p,'run'):
func = getattr(p,'run')
func()
# setattr: 修改或新增类或对象的属性
print('setattr-------------->')
print(p.__dict__)
setattr(p,'name','cobila') # 用于修改
setattr(p,'age',18) # 用于新增
print(p.__dict__)
# delattr: 删除类或对象的属性
print('delattr------------->')
print(p.__dict__)
delattr(p,'name')
print(p.__dict__)
1.2 基于当前模块反射的属性
#!/usr/bin/env python
# __Author__: "wanyongzhen"
# Date: 2017/4/24
import sys
x = 1111
class Foo:
pass
def s1():
print('s1')
def s2():
print('s2')
this_module = sys.modules[__name__] # 获取当前模块
print(this_module)
print(hasattr(this_module,'s1'))
print(getattr(this_module,'s1')) # print(this_module.s1)
print(hasattr(this_module,'s2'))
print(getattr(this_module,'s2')) # print(this_module.s2)
1.3 反射的应用1
#!/usr/bin/env python
# __Author__: "wanyongzhen"
# Date: 2017/4/24
import sys
def add():
print('add')
def delete():
print('delete')
def update():
print('update')
def get():
print('get')
this_module = sys.modules[__name__]
func_dict = {'add':add,'delete':delete,'update':update,'get':get}
while True:
choice = input('>>').strip()
if hasattr(this_module,choice):
func_dict[choice]
1.3 反射的应用2
FTP Client
#!/usr/bin/env python
# __Author__: "wanyongzhen"
# Date: 2017/4/24
class FtpClient:
'ftp客户端,但是还么有实现具体的功能'
def __init__(self,addr):
print('正在连接服务器[%s]'%addr)
self.addr = addr
# def get(self):
# print('get')
FTP Server
#!/usr/bin/env python
# __Author__: "wanyongzhen"
# Date: 2017/4/24
import ftp_client
f1 = ftp_client.FtpClient('192.168.1.1')
if hasattr(f1,'get'):
func_get = getattr(f1,'get')
func_get()
else:
print('Method get not found')
print('处理其他逻辑') # 不影响其他功能实现
2 类内置attr
#!/usr/bin/env python
# __Author__: "wanyongzhen"
# Date: 2017/4/24
# class __getattr__ __setattr__ __delattr__
class Foo:
def __init__(self,name,age):
self.name = name # 会触发__setattr__
self.age = age # 会触发__setattr__
def __setattr__(self, key, value):
print('setattr')
if not isinstance(value,str): # 可以设置类型限制
raise TypeError("must be str")
self.__dict__[key] = value
def __getattr__(self, item): # 属性不存在时会执行此函数
print('getattr')
def __delattr__(self, item):
print('delattr')
self.__dict__.pop(item)
f = Foo('egon',18) # 初始化会触发__setattr__
f.name = 'cobila' # 会触发__setattr__
print(f.__dict__)
f.xxx # 找不到xxx属性时会触发__getattr__
del f.age # 会触发__delattr__
print(f.__dict__)
3 定制自己的数据类型
3.1 继承的方式
#!/usr/bin/env python
# __Author__: "wanyongzhen"
# Date: 2017/4/24
# 定制自己的数据类型 通过继承
class List(list):
def append(self, p_object):
if not isinstance(p_object,int):
raise TypeError('Must be int')
super().append(p_object)
def insert(self,index,p_object):
if not isinstance(p_object, int):
raise TypeError('Must be int')
super().insert(index,p_object)
l1 = List([1,2,3])
print(l1)
l1.append(4)
print(l1)
# l1.append('test') # 会抛出TypeError异常
l1.insert(0,5)
# l1.insert(0,'5') # 会抛出TypeError异常
print(l1)
3.2 授权的方式
#!/usr/bin/env python
# __Author__: "wanyongzhen"
# Date: 2017/4/24
# 定制自己的open函数 不通过继承 通过授权的方式实现定制自己的数据类型
import time
print(time.strftime('%Y-%m-%d %X')) # 打印当前时间
class Open:
def __init__(self,filepath,mode='r',encoding='utf-8'):
self.filepath = filepath
self.mode = mode
self.encoding = encoding
self.f = open(filepath,mode,encoding=encoding)
def write(self,line):
t = time.strftime('%Y-%m-%d %X')
self.f.write('%s %s\n'%(line,t))
def __getattr__(self,item):
func = getattr(self.f,item)
return func
f = Open('b.txt','w')
f.write('test write')
f.write('test write')
f.write('test write')
f.close()
f = Open('b.txt','r+')
res = f.read()
print(res)
f.close()
Python全栈之路-Day31的更多相关文章
- Python全栈之路目录结构
基础 1.Python全栈之路-----基础篇 2.Python全栈之路---运算符与基本的数据结构 3.Python全栈之路3--set集合--三元运算--深浅拷贝--初识函数 4.Python全栈 ...
- Python全栈之路----目录
Module1 Python基本语法 Python全栈之路----编程基本情况介绍 Python全栈之路----常用数据类型--集合 Module2 数据类型.字符编码.文件操作 Python全栈之路 ...
- Python全栈之路----常用模块----hashlib加密模块
加密算法介绍 HASH Python全栈之路----hash函数 Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列 ...
- python 全栈之路
目录 Python 全栈之路 一. Python 1. Python基础知识部分 2. Python -函数 3. Python - 模块 4. Python - 面对对象 5. Python - 文 ...
- Python全栈之路----函数----返回值
函数外部的代码想要获取函数的执行结果,就可以在函数里用return语句,把结果返回. def stu_register(name,age,course='PY',country='CN'): prin ...
- Python全栈之路----常用模块----软件开发目录规范
目录基本内容 log #日志目录 conf #配置目录 core/luffycity #程序核心代码目录 #luffycity 是项目名,建议用小写 libs/modules #内置模块 d ...
- Python全栈之路----常用模块----shutil模块
高级的 文件.文件包.压缩包 处理模块 参考Python之路[第四篇]:模块 #src是原文件名,fdst是新文件名 shutil.copyfileobj(fsrc, fdst[, len ...
- Python全栈之路----Python2与Python3
金角大王Alex python 之路,致那些年,我们依然没搞明白的编码 python2与python3的区别 py2 str = bytes 为什么有bytes? 是因为要表示图片.视频等二进制格式 ...
- Python全栈之路----函数进阶----装饰器
Python之路,Day4 - Python基础4 (new版) 装饰器 user_status = False #用户登录后改为True def login(func): #传入想调用的函数名 de ...
随机推荐
- 1620: [Usaco2008 Nov]Time Management 时间管理
1620: [Usaco2008 Nov]Time Management 时间管理 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 506 Solved: ...
- 谷歌(Google Chrome)插件安装
chrome应用商店打不开,安装插件的另一种方式 接下来以JsonView为例讲解安装步骤: 1.打开GitHub: https://github.com 2.搜索jsonview 3.选择需要的插件 ...
- springmvc基础学习3---注解简单理解
1:@Controller 用来注解这个bean是MVC模型中的一个C 会被spring的auto-scan扫到纳入管理.Spring mvc框架中的action层注入,也就是控制层.控制器Contr ...
- 小梦windows phone 8.1开发:语音朗读
使用SpeechSynthesizer类可以实现文本朗读功能,位于 Windows.Media.SpeechSynthesis命名空间.有了它我们就可以实现有声小说了,是不是很爽.下面给出一个将文本块 ...
- iOS开发之Quartz2D
1. Quartz2D概述及作用 Quartz2D的API是纯C语言的,Quartz2D的API来自于Core Graphics框架. 数据类型和函数基本都以CG作为前缀,比如: CG ...
- Sublime Text 3常用插件
操作:按下Ctrl+Shift+P调出命令面板 输入install 调出 Install Package 选项并回车,然后在列表中选中要安装的插件. 常用插件: 1---- Bracket Highl ...
- Idea Maven 建本地仓库-导入本地JAR包
需求 IDEA 很方便集成了Maven,但是也有相应的问题,比如使用Maven仓没有包的时候不太方便,这时我们需要建立自已的本地仓库来实现 实现 找到Idea的安装目录下面的Maven,我的在 C:\ ...
- JS——函数、事件
1.函数字符串函数 var s=new string(); var ss="hello world"; var sss=""HELLO, WORLD" ...
- .NET Core开源组件:后台任务利器之Hangfire
一.简述 Hangfire作为一款高人气且容易上手的分布式后台执行服务,支持多种数据库.在.net core的环境中,由Core自带的DI管理着生命周期,免去了在NF4.X环境中配置always ru ...
- Linux环境下的IDE,极大提升编程效率
"一个真正的程序员是不用IDE(译者注:集成开发环境)的,他们都是用带着某某插件的文本编辑器来写代码."我们总能在某些地方听到此类观点.然 而,尽管越来越多的人同意这样的观点,但是 ...