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语法笔记的更多相关文章

  1. Python基础语法笔记2

    ------------------------------------------------------------------------------- 常量和Pylint的规范 1.常量:常量 ...

  2. Python3笔记004 - 2.1 python的语法特点

    第2章 python语言基础 python语法特点 保留字与标识符 变量 数据类型 运算符 输入和输出 2.1 python的语法特点 2.1.1 注释 注释的内容将被python解释器忽略,并不会在 ...

  3. 全栈数据工程师养成攻略:Python 基本语法

    全栈数据工程师养成攻略:Python 基本语法 Python简单易学,但又博大精深.许多人号称精通Python,却不会写Pythonic的代码,对很多常用包的使用也并不熟悉.学海无涯,我们先来了解一些 ...

  4. SQL基础语法笔记教程整理

    PS:本文适用SQL Server2008语法. 一.关系型数据库和SQL 实际上准确的讲,SQL是一门语言,而不是一个数据库. 什么是SQL呢?简而言之,SQL就是维护和使用关系型数据库中的的数据的 ...

  5. python基础教程笔记—即时标记(详解)

    最近一直在学习python,语法部分差不多看完了,想写一写python基础教程后面的第一个项目.因为我在网上看到的别人的博客讲解都并不是特别详细,仅仅是贴一下代码,书上内容照搬一下,对于当时刚学习py ...

  6. python核心编程--笔记

    python核心编程--笔记 的解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找pyt ...

  7. python基础语法及知识点总结

    本文转载于星过无痕的博客http://www.cnblogs.com/linxiangpeng/p/6403991.html 在此表达对原创作者的感激之情,多谢星过无痕的分享!谢谢! Python学习 ...

  8. SQL 基础语法笔记教程整理

    最近从图书馆借了本介绍 SQL 的书,打算复习一下基本语法,记录一下笔记,整理一下思路,以备日后复习之用. PS:本文适用 SQL Server2008 语法. 首先,附一个发现的 MySQL 读书笔 ...

  9. Python标准库笔记(11) — Operator模块

    Operator--标准功能性操作符接口. 代码中使用迭代器时,有时必须要为一个简单表达式创建函数.有些情况这些函数可以用一个lambda函数实现,但是对于某些操作,根本没必要去写一个新的函数.因此o ...

随机推荐

  1. RabbitMQ入门教程(二):简介和基本概念

    原文:RabbitMQ入门教程(二):简介和基本概念 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn ...

  2. ExpressionTree学习笔记

    概述: 这段时间需要制定自定义查询条件,感觉有必要学习ExpressionTree. 学习参考资料:https://msdn.microsoft.com/en-us/library/mt654263. ...

  3. luogu P2481 [SDOI2010]代码拍卖会

    luogu 题目中的那个大数一定是若干个1+若干个2+若干个3...+若干个9组成的,显然可以转化成9个\(\underbrace {111...1}_{a_i个1}(0\le a_1\le a_2\ ...

  4. 十二、LaTex中数学公式多行排版

  5. Android 关于悬浮窗权限的问题

    正常情况下的处理: dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)以及在清单文件中添加 <use ...

  6. 2019-11-29-dotnet-文件读写务必注意事项

    title author date CreateTime categories dotnet 文件读写务必注意事项 lindexi 2019-11-29 08:34:43 +0800 2019-10- ...

  7. (转) ORACLE 正确删除归档日志的方法

    ORACLE 正确删除归档日志的方法 我们都知道在controlfile中记录着每一个archivelog文件的相关信息,当然们在OS下把这些物理文件delete掉后,在我们的controlfile中 ...

  8. dedecms织梦无法保存栏目内容的解决方法

    最近使用DedeCms5.3和DedeCms5.5遇到了一个不可思议的问题:在添加栏目时IE内核的浏览器无法保存栏目内容.到网上搜索了半天没找到解决方法,查看DedeCms官方搜索到的结果是“栏目内容 ...

  9. Python核心编程正则表达式练习题1-1 识别后续的字符串:“bat”、“bit”、“but”、“hat”、“hit”或者“hut”

    # 1-1 识别后续的字符串:“bat”.“bit”.“but”.“hat”.“hit”或者“hut”. import re # 正则表达式,|元字符表示选择“或” # character = 'ba ...

  10. 深入理解JAVA虚拟机 虚拟机字节码执行引擎

    执行引擎 执行引擎是java虚拟机的重要组成部分.它的作用是接收字节码,解析字节码,执行并输出执行结果. 虚拟机是相对于物理机的概念,物理机的执行引擎是直接建立在处理器.寄存器.指令集和操作系统的层面 ...