python并发和并行心得体会_python学习心得(三)

一,面向对象编程

1,类和实例,

class Student(object):#括号里面的是继承的类

def __init__(self, name, score):初始化对象时,参数个数

self.name = name

self.score = score

def print_score(self):

print '%s: %s' % (self.name, self.score)

2,访问限制

1,如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__

2,但是如果外部代码要获取name和score怎么办?可以给Student类增加get_name和get_score这样的方法,,好处:可以对参数做检查,避免传入无效的参数:

lass Student(object):

def __init__(self, name, score):

self.__name = name #双下划线,外部无法直接访问

self.__score = score

def print_score(self):

print '%s: %s' % (self.__name, self.__score)

def set_score(self, score): #通过set_来做筛选

if 0 <= score <= 100:

self.__score = score

else:

raise ValueError('bad score')

def get_name(self): #通过get_来获取参数

return self.__name

def get_score(self):

return self.__score

3,继承和多态

1,继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写;默认继承object

2,有了继承,才能有多态。在调用类实例方法的时候,尽量把变量视作父类类型,这样,所有子类类型都可以正常被接收;如猫,狗等都属于动物,即为一种多态表现

4,获取对象信息

1,type方法;

>>> import types

>>> type(int)==types.TypeType

True

>>> type(int)

>>> type(int)==type(str)

True

2,isinstance()方法:>>> isinstance('abc',str)   True

3,dir():获取对象所有方法和属性

>>> dir('o1')

['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split', '_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

(二),面向对象编程

1,绑定

对象和类动态绑定属性和方法:

 View Code

2,限制

但是,如果我们想要限制class的属性怎么办?比如,只允许对Student实例(而非对象)添加name和age属性。

除非在子类中也定义__slots__,这样,子类允许定义的属性就是自身的__slots__加上父类的__slots__

>>> class Student(object):

... __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

...

>>> class GraduateStudent(Student):#新建子类,子类可以为继承父类的__slots__

# 除非在子类中也定义__slots__,这样,子类允许定义的属性就是自身的__slots__加上父类的__slots__。 如添加__slots__=('sex'),即子类被限制为name,age,sex了

... pass

...

>>> g = GraduateStudent()

>>> g.score = 9999

3,@property

作用:既能检查参数,又可以用类似属性这样简单的方式来访问类的变量,即对参数二次开发。

 View Code

4,多重继承

继承的方法按照深度优先的情况选择:如

class Grandfa(object):

def hair(self):

print 'no hair'

class Father(Grandfa):

pass

class Mother(Grandfa):

def hair(self):

print 'long hair'

class Tom(Father,Mother):

pass

me = Tom()

me.hair()

# 输出long hair

关系从上到下为:object→Grandfa→father  and  mother →Tom:深度优先遍历顺序为:Tom→father(没有hair方法)→mother(有hair方法,返回值,遍历结束) 相当于先左子树,再右子树,最后父类寻找方式。

5,定制类

1,__str__和__repr__():两者的区别是__str__()返回用户看到的字符串,而__repr__()返回程序开发者看到的字符串,也就是说,__repr__()是为调试服务的。

>>> class student(object):

... def __str__(self):

... return 'is str'

... def __repr__(self):

... return 'is repr'

...

>>> s=student()

>>> s

is repr

>>> print s

is str

# 通常__str__()和__repr__()代码都是一样的

2,__iter__:如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环

__getitem__:可以按下标获取指定值,或可以向集合一样切片

 View Code

3,__getattr__:防止正常情况下,当我们调用类的方法或属性时,如果不存在,就会报错的情况,

4,__call__:任何类,只需要定义一个__call__()方法,就可以直接对实例进行调用。__call__()还可以定义参数,判断一个对象是否能被调用。

class Student(object):

def __init__(self, name):

self.name = name

def __call__(self):

print('My name is %s.' % self.name)

>>> s = Student('Michael')

>>> s()

My name is Michael.

>>> callable(max)

True #能被调用

>>> callable([1, 2, 3])

False #不能被调用

6,使用元类

:不会碰到需要使用metaclass的情况,暂不了解

(三) 错误调试

1,错误处理

try...except...finally...:finally重会执行:但是finally如果有,则一定会被执行(可以没有finally语句)

raise:raise语句抛出一个错误的实例,print异常,代价大,增加吞吐量,所以用raise抛出即可

抛出异常:如果程序中出现了异常,没有办法将具体的异常打印出来,不做任何处理

捕获异常:如果程序出现了异常,就能够详细的打印是什么原因导致了异常并且能够做出相应的处理,能够显示详细的Log

logging:出错,但程序打印完错误信息后会继续执行,并正常退出。

try:

foo()

except StandardError, e:

print 'StandardError'

except ValueError, e:

print 'ValueError'

# StandardError是ValueError,的父类,所以第二个except永远也捕获不到,子类要重写父类中的方法,如果父类的方法有异常声明,子类异常小于等于父类异常

2,调试

1,assert  断言 来辅助查看的地方

 View Code

2,logging    日志相关操作

import logging

logging.basicConfig(level=logging.INFO)#它允许你指定记录信息的级别,有debug,info,warning,error等几个级别

s='0'

n=int(s)

logging.info('n =%d' %n)

print 10/n

#通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。

3,单元测试

单元测试可以有效地测试某个程序模块的行为,是未来重构代码的信心保证。

单元测试的测试用例要覆盖常用的输入组合、边界条件和异常。

单元测试代码要非常简单,如果测试代码太复杂,那么测试代码本身就可能有bug。

单元测试通过了并不意味着程序就没有bug了,但是不通过程序肯定有bug。

 View Code

4,文档测试

doctest非常有用,不但可以用来测试,还可以直接作为示例代码。通过某些文档生成工具,就可以自动把包含doctest的注释提取出来。用户看文档的时候,同时也看到了doctest。

class Dict(dict):

'''

Simple dict but also support access as x.y style.

>>> d1 = Dict()

>>> d1['x'] = 100

>>> d1.x

100

>>> d1.y = 200

>>> d1['y']

200

>>> d2 = Dict(a=1, b=2, c='3')

>>> d2.c

'3'

>>> d2['empty']

Traceback (most recent call last):

...

KeyError: 'empty'

>>> d2.empty

Traceback (most recent call last):

...

AttributeError: 'Dict' object has no attribute 'empty'

'''

def __init__(self, **kw):

super(Dict, self).__init__(**kw)

def __getattr__(self, key):

try:

return self[key]

except KeyError:

raise AttributeError(r"'Dict' object has no attribute '%s'" % key)

def __setattr__(self, key, value):

self[key] = value

if __name__=='__main__':

import doctest

doctest.testmod()

# python Dict.py 没结果输出,表示运行正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值