Python全栈之路-Day32
1 类的__slots__
#!/usr/bin/env python
# __Author__: "wanyongzhen"
# Date: 2017/4/25
# 只能定义__slots__中规定的属性
#__slots__ 用于统一管理所有属性的定义
# 类变量,变量值可以是列表,元祖,或者可迭代对象,也可以是一个字符串(意味着所有实例只有一个数据属性)
class People:
__slots__ = ['x','y','z']
p = People()
p.x = 1
p.y = 2
p.z = 3
print(p.x,p.y,p.z)
p.v = 4 # 会抛出AttributeError异常
2 迭代器协议
#!/usr/bin/env python
# __Author__: "wanyongzhen"
# Date: 2017/4/25
# __next__ __iter__
from collections import Iterable,Iterator
class Foo:
def __init__(self,start):
self.start = start
def __iter__(self):
return self
def __next__(self):
if self.start > 10:
raise StopIteration
num = self.start
self.start += 1
return num
f = Foo(0)
print(isinstance(f,Iterable))
print(isinstance(f,Iterator))
print(next(f))
print(next(f))
for item in f:
print(item)
# 利用迭代特性实现简单的range函数功能
class Range:
def __init__(self,start,end):
self.start = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.start > self.end:
raise StopIteration
num = self.start
self.start += 1
return num
for item in Range(0,2):
print(item)
3 类的__del__
#!/usr/bin/env python
# __Author__: "wanyongzhen"
# Date: 2017/4/25
import time
class Open:
def __init__(self,filepath,mode='r',encode='utf-8'):
self.f = open(filepath,mode,encoding=encode)
def write(self):
pass
def __getattr__(self, item):
return getattr(self.f,item)
def __del__(self): # 当执行del f(并且引用计数为0时)时会触发这里的函数运行(程序结束时也会运行),一般执行一些清理操作
print('del func')
self.f.close()
f = Open('a.txt','w')
del f
time.sleep(5)
4 上下文管理协议
#!/usr/bin/env python
# __Author__: "wanyongzhen"
# Date: 2017/4/25
with open('a.txt','r') as f:
print('--------->')
print('--------->')
print(f.read())
class Foo:
def __enter__(self):
print('enter...')
return self
def __exit__(self, exc_type, exc_val, exc_tb): # with代码块结束或者出现异常时执行
print('exit...')
print('exc_type',exc_type)
print('exc_val',exc_val)
print('exc_tb',exc_tb)
return True # 处理异常后返回True
with Foo() as f: # f = Foo().__enter__()
print('with Foo code area')
raise TypeError('Error value') # 会调用__exit__
5 元类
#!/usr/bin/env python
# __Author__: "wanyongzhen"
# Date: 2017/4/26
# 元类 type
# 元类(type) --> 类(class) --> 对象(object)
# 1.通常的创建类的方式
class Foo: #
x = 1
def run(self):
pass
class test:
pass
print(Foo.__dict__)
print(Foo.__bases__)
print(type(Foo))
# 2.通过元类(type)创建类的方式
def run():
pass
class_name = 'Foo'
class_bases = (object,)
class_dict = {'x':1,'run':run}
Foo = type(class_name,class_bases,class_dict)
print(Foo.__dict__)
print(Foo.__bases__)
print(type(Foo))
# 元类应用
# 类的函数必须要写注释(__doc__)
class Mymeta(type):
def __init__(self,class_name,class_bases,class_dict):
for key in class_dict:
if callable(class_dict[key]):
if not class_dict[key].__doc__:
raise TypeError('小子,你没写注释,赶紧去写')
class Foo(metaclass=Mymeta): # Foo = Mymeta('Foo',(object,),{'x':1,'run':run}) 定义时会执行metaclass的__init__
x = 1
def __init__(self,name):
self.name = name
def run(self):
'run func'
print('running')
print(Foo.__dict__)
# 元类实例化过程
class Mymeta(type):
def __init__(self,class_name,class_bases,class_dict):
for key in class_dict:
pass
def __call__(self, *args, **kwargs):
print(self)
obj = self.__new__(self)
self.__init__(obj,*args,**kwargs)
return obj
class Foo(metaclass=Mymeta): # Foo = Mymeta('Foo',(object,),{'x':1,'__init__':__init__,'run':run}) 调用Mymeta的__init__
x = 1
def __init__(self,name):
self.name = name
def run(self):
'run func'
print('running')
f = Foo('egon') # 调用Mymeta的__call__
Python全栈之路-Day32的更多相关文章
- 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 ...
随机推荐
- 文件File
前面的话 不能直接访问用户计算机中的文件,一直都是Web应用开发中的一大障碍.2000年以前,处理文件的唯一方式就是在表单中加入<input type="file">字 ...
- gitoschina使用入门
1 下载git sudo apt-get install git 2 添加公钥:terminal: ssh-keygen -t rsa -C "git.oschina.net" ...
- T——SQL基础语句(定义变量,赋值,取值,分支,循环,存储过程)
T--SQL基础语句 1.定义变量: declare @变量名 数据类型 ; declare @a int ; declare @b nvarchar(10) ; 2.赋值: 法1:set @变量名 ...
- CoreAnimation 变换
CoreAnimation 变换 CoreAnimation 目录 博客园MakeDown支持不佳,如有需要请进GitHub 本片博客主要内容: 仿射变换 - CGAffineTransform 3D ...
- PDCA循环原理
1.PDCA循环原理:plan do check action 以pdca质量环模型为质量控制和保证的理论依据,对软件质量进行把控. plan计划阶段:项目质量规划 1.分析现状,找出质量问题 2 ...
- [译]Selenium Python文档:三、导航控制
你使用WebDriver要做的第一件事就是访问一个链接.一般通过调用get方法来实现: driver.get("http://www.baidu.com") 在将控制权返给你的脚本 ...
- QQGame防专线中断系统介绍
先说说背景 QQGame是一个全区全服的休闲类游戏平台和社区,主逻辑服务器部署在四大IDC,核心DB全部在深圳.对跨IDC的专线依赖度很高. 网平提供专线故障后切VPN的备份机制,当VPN也中断时QQ ...
- Android中的Drawable和动画
Android中Drawable是一种可以在Canvas上进行绘制抽象的概念,种类很多,常见的颜色和图片都可以是一个Drawable.Drawable有很多种,它们表示一种图像的概念,但是它们又不全是 ...
- CentOs6系统安装mailx发邮件
1. yum -y mail* sendmail* postfix* service sendmail start 2. cp /etc/mail.rc /etc/mail.rc.bak cat &g ...
- datagrid-detailview.js easyui表格嵌套
datagrid-detailview.js easyui表格嵌套