一些笔记
1.并发和并行:所有程序在经由一个cpu处理时,cpu经过操作系统调度,将一段时间分割成若干份,分别去执行需要执行的程序就是并发;多个处理器分别处理多个程序叫做并行。
2.关于元类
a.我们使用class关键字定义类的时候,method的第一个参数一般总是self,它指向调用method的对象(类实例)本身。
b.实际上,当我们使用class关键字定义好一个类,python解释器就是通过调用type函数来构造类的,它以我们写好的类定义(包括类名,父类,属性)作为参数,并返回一个类。
c.对于自定义元类,大致步骤为接受类定义,修改类定义,再返回一个类。
class AddPrefixMetaclass(type):
# 此处new的参数也是约定俗成的写法,就像用**kw表示关键字参数一样
# cls - 使用自定义元类要创建的类,你可以就简单地记成self
# clsname - 类名
# bases - 父类的元组的(tuple)
# dct - 类属性的字典
def new(cls, clsname, bases, dct):
prefix = “kissg_”
addprefix_dict = {}
for name, val in dct.items():
if not name.startswith(‘_’):
addprefix_dict[prefix + name] = val
else:
addprefix_dict[name] = val
# 元类也是可以被继承的。
# 调用父类的new方法来创建类,简化继承
return super(AddPrefixMetaclass, cls).new(cls, clsname, bases, addprefix_dict)
参见http://kissg.me/2016/04/25/python-metaclass/
3.Python 用下划线作为变量前缀和后缀指定特殊变量。 _xxx 不能用’from moduleimport ‘导入 xxx 系统定义名字 xxx 类中的私有变量名 核心风格:避免用下划线作为变量名的开始。 因为下划线对解释器有特殊的意义,而且是内建标识符所使用的符号,我们建议程序员避免用下划线作为变量名的开始。一般来讲,变量名_xxx被看作是“私有 的”,在模块或类外不可以使用。当变量是私有的时候,用_xxx 来表示变量是很好的习惯。因为变量名__xxx对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。 “单下划线” 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量; “双下划线” 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。 以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import ”而导入;以双下划线开头的(__foo)代表类的私有成员;以双下划线开头和结尾的(foo)代表python里特殊方法专用的标识,如 init()代表类的构造函数。
结论:
1、_xxx 不能用于’from module import *’ 以单下划线开头的表示的是protected类型的变量。即保护类型只能允许其本身与子类进行访问。
2、__xxx 双下划线的表示的是私有类型的变量。只能是允许这个类本身进行访问了。连子类也不可以
3、xxx_ 定义的是特列方法。像init之类的
4.@staticmethod和@classmethod的作用与区别
一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法。
而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用。
这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁。
既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢
从它们的使用上来看,
@staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样。
@classmethod也不需要self参数,但第一个参数需要是表示自身类的cls参数。
如果在@staticmethod中要调用到这个类的一些属性方法,只能直接类名.属性名或类名.方法名。
而@classmethod因为持有cls参数,可以来调用类的属性,类的方法,实例化对象等,避免硬编码。
下面上代码。
class A(object):
bar = 1
def foo(self):
print ‘foo’
@staticmethod
def static_foo():
print 'static_foo'
print A.bar
@classmethod
def class_foo(cls):
print 'class_foo'
print cls.bar
cls().foo()
A.static_foo()
A.class_foo()
输出:
static_foo
1
class_foo
1
foo