一些笔记

一些笔记

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值