[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 ...
随机推荐
- C++ 调用C语言、extern "C"、__cplusplus关键字
——C++编译器完全兼容C语言的编译方式.(但是得有源代码) ——C++编译器会优先使用C++的编译方式进行编译 ——extern "C" 关键字能够强制C++编译器进行C方式的编 ...
- Linux下Eclipse里用gdb调试JNI里C/C++
1,给Eclipse安装CDT插件 2,先以Debug方式运行java程序,停在java代码的断点上 3,Debug Configuration里选择C/C++ Attach to Applicati ...
- mydql 设置充许远程链接
1 本机作为服务器时,其他机器连接不上? 1)看一下防火墙是否打开了. 2)在cmd中设置权限. 第一种:(进入数据库的情况下) 1.d:\mysql\bin\>mysql -h localho ...
- C++ STL(一)string的用法
# 1.string的用法- string在<iostream>的头中就有,但是还是得用<string>的头 ##### 构造函数- str(const char* ch) 直 ...
- python代码优化-----cpu和内存监控
1.memory_profiler可以监控代码的内存消耗及增长量,以下面的代码为例. 发现在for循环里增加了0.3MB,这个工具可以帮助我们定位内存泄露的问题. 2.profile与cProfile ...
- (转) Java中的负数及基本类型的转型详解
(转) https://my.oschina.net/joymufeng/blog/139952 面这行代码的输出是什么? 下面两行代码的输出相同吗? 请尝试在Eclipse中运行上面的两个代码片段, ...
- php基于websocket实现的在线聊天室
听说websocket技术可以实现 1.
- docker python3环境搭建
1.使用镜像为daocloud的python镜像 docker run -it --rm --name my-running-script -v "$PWD":/usr/src/m ...
- 针对vs2017 对mvc 网站建设的调用问题(调用的目标发生异常)
上篇提到,vs 2017 在mvc 网站建设中,启动登录页面实现登陆功能时,会出现调用的目标发生异常的问题,目前解决该问题的办法还没找到,本人也是vs 2017 的初学者,希望大神可以指点迷津.目前测 ...
- vue和electron做的聊天应用表情包处理
表情包库: https://apps.timwhitlock.info/emoji/tables/unicode <template> <div @click.stop> &l ...