今天看了python的教程,遂开始记笔记。
I. 装饰器:
import functools def foo(func):@functools.wraps(func)def wrapper (*args,**kw):print 'call %s():'%func.__name__return func(*args,**kw) #1return wrapper@foo def log(): #2print '20161219' log()
此处不能用 log('xx')的形式插入参数,因为装饰器最后实现的还是被装饰函数logd()实现,它没有参数,#1处就算传入参数也会报错,如果想要装饰器中传入参数,则1,2 都需要设定成,尤其是2需要设定至少一个参数才可。
只有一个思考题,思考一下能否写出一个
@log
的decorator,使它既支持:
又支持@log def f():pass
@log('execute') def f():pass
II.偏函数(略)
III. 模块
作用域:在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在Python中,是通过
_
前缀来实现的。
正常的函数和变量名是公开的(public),可以被直接引用,比如:
abc
,x123
,PI
等;类似
__xxx__
这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的__author__
,__name__
就是特殊变量,hello
模块定义的文档注释也可以用特殊变量__doc__
访问,我们自己的变量一般不要用这种变量名;类似
eg:_xxx
和__xxx
这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc
,__abc
等;
def _private_1(name):return 'Hello, %s' % namedef _private_2(name):return 'Hi, %s' % namedef greeting(name):if len(name) > 3:return _private_1(name)else:return _private_2(name)
我们在模块里公开
greeting()
函数,而把内部逻辑用private函数隐藏起来了,这样,调用greeting()
函数不用关心内部的private函数细节,这也是一种非常有用的代码封装和抽象的方法,即:外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public。
IX.面向对象编程面向对象的设计思想是抽象出Class,根据Class创建Instance。
面向对象的抽象程度又比函数要高,因为一个Class既包含数据,又包含操作数据的方法。
数据封装、继承和多态是面向对象的三大特点。
X.class
类可以自由的绑定变量,如果想便向不被访问那么:
可以把属性的名称前加上两个下划线__
,在Python中,实例的变量名如果以__
开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问:
如果还想访问其值则需要通过方法来实现.class Student(object):def __init__(self, name, score):self.__name = nameself.__score = scoredef print_score(self):print '%s: %s' % (self.__name, self.__score)
双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问
__name
是因为Python解释器对外把__name
变量改成了_Student__name
,所以,仍然可以通过_Student__name
来访问__name
变量:>>> bart._Student__name 'Bart Simpson'
但是强烈建议你不要这么干,因为不同版本的Python解释器可能会把
__name
改成不同的变量名。总的来说就是,Python本身没有任何机制阻止你干坏事,一切全靠自觉。
XI.继承和多态isinstance() 函数可以用来判断类型,返回 t & f
eg:isinstace(a,list)
要理解多态的好处,我们还需要再编写一个函数,这个函数接受一个Animal类型的变量:
def run_twice(animal):animal.run()animal.run()
当我们传入Animal的实例时,
run_twice()
就打印出:>>> run_twice(Animal()) Animal is running... Animal is running...
当我们传入Dog的实例时,
run_twice()
就打印出:>>> run_twice(Dog()) Dog is running... Dog is running...
当我们传入Cat的实例时,
run_twice()
就打印出:>>> run_twice(Cat()) Cat is running... Cat is running...
看上去没啥意思,但是仔细想想,现在,如果我们再定义一个Tortoise类型,也从Animal派生:
class Tortoise(Animal):def run(self):print 'Tortoise is running slowly...'
当我们调用run_twice()时,传入Tortoise的实例:
>>> run_twice(Tortoise()) Tortoise is running slowly... Tortoise is running slowly...
你会发现,新增一个Animal的子类,不必对run_twice()做任何修改,实际上,任何依赖Animal作为参数的函数或者方法都可以不加修改地正常运行,原因就在于多态。
多态的好处就是,当我们需要传入Dog、Cat、Tortoise……时,我们只需要接收Animal类型就可以了,因为Dog、Cat、Tortoise……都是Animal类型,然后,按照Animal类型进行操作即可。由于Animal类型有
run()
方法,因此,传入的任意类型,只要是Animal类或者子类,就会自动调用实际类型的run()
方法,这就是多态的意思:
详细解决方案
Python note (one)
热度:48 发布时间:2023-12-22 03:12:40.0
相关解决方案
- ubuntu9.04上安装mic2 出错 (python setup.py build)
- ubuntu9.04下安装mic2 出错 (python setup.py build),该如何解决
- 请教如何理解JAVA、C++ Perl、PHP、Ruby、Python
- python sybase装配
- python(django框架) + mysql 的编码有关问题,求解
- CSS Note 一
- SAE python web.py bootstrap 开发记要
- 数目字代码把大数据数字口语化(python+js) 数字代码
- JS + JQUERY > note 一
- note.js,该怎么解决
- python JSON string 的中文有关问题
- python――施用yaml数据格式,PK -> XML,JSON
- Learn Python The Hard Way学习(52) - 开始您的web游戏
- Python 相关有关问题
- 请问html中<a href=Note?status=selectall>的含义
- 菜鸟,先学JAVA,还是Ruby,python
- 生手之前对编程无概念现在想转这行,想尽快入门,java ,python,net、php、C之间如
- NOTE!NOTE
- 编译出错!Note: E:\design-houq\TongJi.java uses unchecked or unsafe operations,该如何解决
- 只为“技术性击倒”iPhone5?三星Galaxy Note 二消息汇总
- iphone note -六
- 【大哥大姐】python 操作MS SQL Server 2005 效率
- python serial模块运用
- python scp自动登录解决方法
- 【Python】按行读取文件、IOError: [Errno 22] invalid mode ('a+') or filename,处置文件的换行符
- Python 3.x中使用print函数出现语法异常(SyntaxError: invalid syntax)的原因
- 【Error】Python安装gevent时出错:“致命异常: Python.h:没有那个文件或目录”
- [Python]attributeError:'module' object has no attribute 'dump'
- Python 出错:IndentationError: unexpected indent
- Python“TypeError: 'NoneType' object is not iterable"的缘故