[python] Pythonic语法笔记
Pythonic语法笔记
__new__
在类实例化之前执行的,也就是在init之前执行,可以为这个类写操作。接受的参数不是self而是cls。只有在new方法里返回类才会执行init操作,需要返回父类的new。
class A(object):
def __new__(cls,name):
print("cls name:{}".format(name))
return super().__new__(cls)
def __init__(self,name):
print("self name:{}".format(name))
if __name__ == "__main__":
a = A("ok")
'''
cls name:ok
self name:ok
'''
getattr和getattribute
在查找不到属性的时候会调用__getattr__
class A():
def __init__(self,name):
self.info = {
"Name":name
}
def __getattr__(self,item):
return self.info[item]
if __name__ == '__main__':
a = A('aa')
print(a['Name'])
__getattribute__管理的是整个类的属性访问,一般不重写,getattr实际上会在getattribute中被调用,重写了之后可能会导致整个类的崩溃,所以一般不重写。getattribute是无条件调用的,无论是否存在属性,都会被调用。
type
type是用来创建类的类,是元类的一种,所以我们也可以通过type函数来动态创建一个类。
type函数有三个参数,第一个是类名,第二个是基类名,第三个是属性
def say():
print("something")
User = type('user',(),{'name':'xueaoru',"say":say})
user = User()
print(user.name)
user.say()
'''
xueaoru
something
'''
实际使用过程中一般不用type直接创建类,而是使用元类,定义metaclass去创建。
我们知道new方法是可以控制在类实例化的过程,而使用元类可以使这个过程分离,单独创建一个类去管理该类的实例化过程,这样代码分离性比较好,所以称之为metaclass。
class MetaClass(type):
def __new__(cls,*args,**kwargs):
return super().__new__(cls,*args,**kwargs)
class Base(metaclass=MetaClass):
def __init__(self, *args, **kwargs):
return super().__init__(*args, **kwargs)
class User(Base):
def __init__(self, name,*args, **kwargs):
self.name = name
return super().__init__(*args, **kwargs)
def __str__(self):
return "user"
if __name__ == "__main__":
user = User("aoru")
print(user)
先定义了一个MetaClass,继承了type,这里其实和直接是type区别不大,因为直接返回super,也就是让实例化的过程交给父类来做,也就是type,然后定义base类,base类的metaclass是MetaClass,所以用MetaClass来做实例化的过程,User由于继承自base类,所以查找metaclass的时候自己没有,就调用基类的metaclass。
属性描述符
实际上是一个用来描述属性的类,需要定义其get方法或者是set方法,可以用来做类型的检查。
# 属性描述符类
class IntField():
def __set__(self,instance,value):
if not isinstance(value,int):
raise ValueError("int value err")
class User():
age = IntField()
if __name__ == "__main__":
user = User()
user.age = '2'
'''
Traceback (most recent call last):
File "/media/xueaoru/其他/ML/推荐系统入门/my_attr_desc_demo.py", line 9, in <module>
user.age = '2'
File "/media/xueaoru/其他/ML/推荐系统入门/my_attr_desc_demo.py", line 4, in __set__
raise ValueError("int value err")
ValueError: int value err
'''
数据查找过程,先查找类中的数据描述符对象,然后查找对象中的属性,然后查找类中或者基类中的属性,而在类中或者基类中查找的时候属性描述符优先。最后如果查找不到,就会调用类的getattr函数,没有就抛出异常。
迭代器
基于两个语法,next返回下一个迭代对象,__iter__返回被迭代的对象本身。
class Myobject():
def __init__(self,step):
self.step = step
def next(self):
if self.step == 0:
raise StopIteration
self.step-=1
return self.step
def __iter__(self):
return self
则Myobject对象可被迭代。
与生成器的不同
生成器是使用了yield函数的,返回迭代器的函数,只能用于迭代操作。每次遇到yield时,函数会暂停病保存当前所有的运行信息,返回yield值,病在下一次执行next方法时从当前位置继续执行。调用一个生成器函数,返回的是一个迭代器对象。我们用的比较多的生成器是列表生成器,一个简单的生成器的例子:
def fib(n):
a,b,cnt = 1,1,0
while True:
if cnt > n:
return
yield a
a,b,cnt = b,a+b,cnt+1
f = fib(10)
for ff in f:
print(ff)
'''
1
1
2
3
5
8
13
21
34
55
89
'''
[python] Pythonic语法笔记的更多相关文章
- Python基础语法笔记2
------------------------------------------------------------------------------- 常量和Pylint的规范 1.常量:常量 ...
- Python3笔记004 - 2.1 python的语法特点
第2章 python语言基础 python语法特点 保留字与标识符 变量 数据类型 运算符 输入和输出 2.1 python的语法特点 2.1.1 注释 注释的内容将被python解释器忽略,并不会在 ...
- 全栈数据工程师养成攻略:Python 基本语法
全栈数据工程师养成攻略:Python 基本语法 Python简单易学,但又博大精深.许多人号称精通Python,却不会写Pythonic的代码,对很多常用包的使用也并不熟悉.学海无涯,我们先来了解一些 ...
- SQL基础语法笔记教程整理
PS:本文适用SQL Server2008语法. 一.关系型数据库和SQL 实际上准确的讲,SQL是一门语言,而不是一个数据库. 什么是SQL呢?简而言之,SQL就是维护和使用关系型数据库中的的数据的 ...
- python基础教程笔记—即时标记(详解)
最近一直在学习python,语法部分差不多看完了,想写一写python基础教程后面的第一个项目.因为我在网上看到的别人的博客讲解都并不是特别详细,仅仅是贴一下代码,书上内容照搬一下,对于当时刚学习py ...
- python核心编程--笔记
python核心编程--笔记 的解释器options: 1.1 –d 提供调试输出 1.2 –O 生成优化的字节码(生成.pyo文件) 1.3 –S 不导入site模块以在启动时查找pyt ...
- python基础语法及知识点总结
本文转载于星过无痕的博客http://www.cnblogs.com/linxiangpeng/p/6403991.html 在此表达对原创作者的感激之情,多谢星过无痕的分享!谢谢! Python学习 ...
- SQL 基础语法笔记教程整理
最近从图书馆借了本介绍 SQL 的书,打算复习一下基本语法,记录一下笔记,整理一下思路,以备日后复习之用. PS:本文适用 SQL Server2008 语法. 首先,附一个发现的 MySQL 读书笔 ...
- Python标准库笔记(11) — Operator模块
Operator--标准功能性操作符接口. 代码中使用迭代器时,有时必须要为一个简单表达式创建函数.有些情况这些函数可以用一个lambda函数实现,但是对于某些操作,根本没必要去写一个新的函数.因此o ...
随机推荐
- matlab读取内容为二进制的TXT文件
本方法同样适合读取十六进制和二进制以外的其他进制文件,txt使用一个最简单的命令就可以读取 textread 这是一个十分有用,简便的函数(对于fopen fscanf而言)读取二进制txt文件:假如 ...
- 交叉工具链和makefile
交叉工具链: arm-linux-gcc:交叉编译器 arm-linux-ld:交叉连接器 arm-linux-readelf:交叉ELF文件工具 arm-linux-objdump:交叉反汇编器 a ...
- keepalived启动后报错:(VI_1): received an invalid passwd!的解决办法
一.配置好keepalived.conf文件后,启动keepalived,查看/var/log/message日志报错: [root@push-- sbin]# tail -f /var/log/me ...
- qt常用技巧
发布程序:windeployqt hello.exe QString乱码问题,在字符串前加u8
- 【POJ2486】Apple Tree
题目大意:给定一棵 N 个节点的有根树,点有点权,边权均为1.现允许从根节点出发走 K 步,求可以经过的点权之和最大是多少. 题解:可以将点权看作是价值,将可以走的步数看作是重量,则转化成了一个树上背 ...
- Flask【第10篇】:自定义Form组件
自定义Form组件 一.wtforms源码流程 1.实例化流程分析 1 # 源码流程 2 1. 执行type的 __call__ 方法,读取字段到静态字段 cls._unbound_fields 中: ...
- Python之常用模块三(面向对象相关的三个模块)
hashlib.configparser.logging模块 一.常用模块二 hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等. 那么什么是摘要算法呢?摘要算法又称为哈希 ...
- JVM体系结构及优化
源文档:https://docs.oracle.com/javase/8/docs/technotes/guides/vm/index.html JVM体系结构 方法区,类加载器,堆,Java ...
- wordpress设置本地化语言
wordpress语言本地化 在wordpress上很多插件不支持本地化语言如:中文,需要本地化,则需要制作本地化语言的po(用于编辑)和mo(用于机器识别)文件.可以没有*.po文件,但是不能没有* ...
- C# 、Java数组申明、初始化区别
一.数组申明 int[] a1 int a2[] C# 支持 不支持 Java 支持 支持 二.数组申明且初始化 int[] a1 = new int[] { 2, 31 } int a1[ ...