您的位置:首页 > 编程语言 > Python开发

python学习的一些笔记

2016-06-13 20:25 190 查看
这些是本人学习python3时的一些笔记。没有提供上下文信息,也没有将文档写完整。等学习了markdown之后有时间再进行整理。

一、类和对象

python中的类也是对象;函数也是对象,模块也是对象,包也是对象。

用它创建对象时会自动执行__init__方法;

用它创建的对象将会拥有类方法对应的实例方法;(如类方法sayHello(self)对应的实例方法为sayHello())

类变量,实际上就是类对象的属性,它在类中方法外定义/添加;

实例变量,实际上就是用类创建出来的对象的属性,它在方法中通过 self.属性名 = 属性值 的方式定义/添加,也可以在运行时动态定义/添加;

库、包、模块、类、对象

其中,前四个是层级的概念;

一个库中可以有多个包,一个包中可以有多个模块(还可以定义全局变量和全局函数),一个模块中可以定义多个类(还可以定义全局变量和全局函数);

python支持多种编程范式。

python面向对象

封装:python中没有真正的私有变量,它仍然可以在类/对象外部访问。

内省:通过内置属性,如__name__、__module__等。但是这些属性并不是只读的。

多态:python支持类级别的多态,并不支持方法重载级别的多态。

虽然它支持函数的默认值写法。但本质上仍然不一样。试想,一个方法接受一个字符串参数,进行一些处理。

现在需要支持整形参数,python必须修改原来的代码(违背了开闭原则)。

继承:python对继承的支持很好。

接口:python中没有接口。但是由于其支持多继承,可以用空实现的基类伪装成接口。这样做需要programer区分哪些属于接口,并且自觉提供接口实现。

实际上,如果不是为了内省,python根本不需要接口。所有对象有相应的方法,即可认为实现了对应的接口。只是没有快捷方式知道它实现了特定的接口(方法集)。

模块:支持

包:支持

库:支持

javascript面向对象

封装:貌似可以实现,不过也很麻烦。

内省:匿名函数内省能力不足。

多态:支持类级别的多态,并不支持方法重载。

继承:使用原型prototype,稍麻烦。并且无法通过函数声明获得继承信息。

接口:不支持。可以参考《javascript设计模式》实现接口。但仍然存在无法内省接口的问题。

模块:模块加载器

包:包管理器

库:无

当然,比较两种语言,还有更多的place需要比较。

javascript有ecmascript规范,这属于语言规范。js由于浏览器的原因,会有多家相互竞争,相互促进发展。而python没有。

java有极其多的规范,包括虚拟机规范,java语言规范,以及各种应用的通用解决方案规范(rmi\jms\jdbc\jndi\jta and so on)。

而python有数据库连接通用接口规范,其他?。

在进行语言比较时,不能只拿语言的语法及特性进行比较。更要拿重要的概念去比较。

java有ioc容器(spring),可以很方便的实现对对象的管理,对匹配类型的对象进行aop,进而实现统一事务管理。貌似python和node都还没有?python和node通过模块,实现ioc。

二、cgi环境搭建

假设已经安装python3。

接下来到apache官网下载http服务器。

注意:apache不提供二进制文件。需要自己编译。

不过,可以到镜像地址下载二进制文件。

找到Apache Lounge,下载。
http://httpd.apache.org/docs/current/platform/windows.html#down
不知道和apache haus有什么区别。

貌似后者配置文件中服务根目录和文档根目录用的是变量,更灵活。

解压后放到要放的目录。

测试可以用性。

修改配置文件httpd.conf。

2.4版的和2.2版的不一样。网上的答案基本上是2.2的,不适合自己的环境。

需要修改的地方(假设apache的httpd.exe所在目录为d:/Apache24/bin/):

AddHandler cgi-script .cgi .py

DocumentRoot "d:/Apache24/htdocs"

<Directory "d:/Apache24/htdocs">

<Directory "d:/Apache24/cgi-bin">

ServerRoot "d:/Apache24"

ScriptAlias /cgi-bin/ "d:/Apache24/cgi-bin/"

LoadModule cgid_module modules/mod_cgid.so

(这行如果不去掉注释,那么服务器就不会执行cgi脚本。它会将脚本文件当文本输出。)

然后在cig-bin目录下创建hello.py

#!/Program Files/Python35/python

print("Content-type:text/html\r\n")

print('<html>')

print('<head>')

print('<title>Hello Word - First CGI Program</title>')

print('</head>')

print('<body>')

print('<h2>Hello Word! This is my first CGI program</h2>')

print('</body>')

print('</html>')

注意:python中#开头的行是注释。但是!#!/Program Files/Python35/python却是一个给shell提供执行环境的注释!!!

运行时一定不能去掉这行。

print函数会自动添加换行符,所以按照http协议,响应头之后有一个空行,然后是响应体。

所以最好是每个print语句中不要加\r\n,而在print响应头之后,添加一个语句print()。(不要像教程上那样写!)

三、python连接mysql

假设已经安装了python3和mysql5.6

python3不再支持MYSQLdb,所以我们用pymysql。

到pymysql的github上(https://github.com/PyMySQL/PyMySQL#test-suite),查看readme。

他会告诉我们,在命令行pip install PyMySQL。(不需要下载源码进行编译哦)

pip是python的包管理器。

然后按照上面说的测试就行了。

db apis,请到python官网查看文档。

python为各个数据库提供了统一的接口。所以,可以到mysql的官网上查看例子,而不用mysql提供的包。
http://dev.mysql.com/doc/connector-python/en/connector-python-option-files.html
也可以到mysql官网,查看python接口。

连接postgresql时,请到postgresql官网上查找python关键字,可以找到对应的文档。

总结:

1、到对应数据库官网找;

2、到python官网找;

3、有些python官网上没有,数据库官网也没有。到社区、各资料网站上去找吧;

和java的jdbc比较

python定义了一系列接口,各数据库厂商提供接口的具体实现。然后我们的程序,只需要修改import语句和连接的url字符串以及获取connection的语句。

修改它们就是修改源文件。但是由于python是动态语言,不需要编译,所以没什么问题。

而java不同,如果没有jdbc,就需要new一个实现类。这样在切换数据库时,需要修改源代码(而不是配置文件),需要重新编译。

一般服务器上不会安装编译环境的。所以这就导致了麻烦。

jdbc的重要作用之一,就是将dao只面向sql包中的接口,而与任何实现类分离(分离的程度,达到了只需要修改配置文件即可实现数据库切换的级别),

从而避免不必要的重新编译的麻烦。

从软件项目的生命周期来看,这是将软件的编译与部署进行分离的手段。

四、元组

def returnWhat():
return (1,2)
#return 1,2 会被封装成元组返回

#t = x,y = returnWhat()

x =1;y=2

t = x,y#等价于t = (x, y)即=号后面被自动封装为元组

print(t)

x = 3

print(x)

五、

TODO

CGI调试

python中的闭包

python中也有闭包。

因为它的函数和javascript一样可以嵌套定义,并且它们的作用域规则大致一样。

函数的作用于,是在函数执行时创建的。

函数的形參,在函数定义时,并未创建变量,所以这时也不会分配空间。

JAVA中可以在方法中定义类,叫做局部内部类。

局部内部类中只能访问方法中的常量!!!

这就是说,java这种语言从某种程度上说支持函数的嵌套定义(当然不是直接嵌套)。

但是为了简单性,防止了闭包这种现象的产生。

当然,这里还应该有个效率问题,只在第一次调用的时候生成该类,而不是每次执行

这个方法的时候生成一次类。

迭代器、生成器、列表解析

for语句中要求对象必须是迭代器对象或者生成器对象或者去重复索引序列。

所以它们之间的关系是一种平行关系。

迭代器只要求对象能够被迭代,而不要求next()方法返回对象的实现方式。

生成器则是yeild一个值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python