1,类与对象
java
类,是函数的更高级抽象。它描述的是一类事物具备的广泛特性,而函数则是描述这些广泛特性中的某一个点。python
好比说对于车来讲,有各类各样的车,车也有各类各样的功能和属性。若是采用函数来抽象,那么若是要完整的抽象一辆车出来,那么会须要不少函数相互配合,固然这其中一定少不了全局变量。采用函数的方式来抽象车的话,会有一个弊端,就是时隔好久以后,你能够记不起来这辆车是由哪些函数和全局变量抽象而来的。程序员
因而面向对象编程,也就是类的出现,解决了这个问题。编程
类,抽象的是车这一类物体,描述它们的共有属性和功能,而后由该类衍生而来的子类又具备各自特有的属性和功能,同时,在类的定义中,咱们把须要描述该类事物所必须的方法(功能)和属性,集中到一个“类”中,这样你永远不会忘记,这辆车是怎么来的。eclipse
那么,相对于类而言,对象则是类的一个具体的个体。好比说,车中有自行车,那自行车又有不少中,那你说的这个自行车究竟是那一个呢?这就须要一个实实在在的“东西”来表示,在面向对象中,这个“东西”就是对象。也就是说,对象是类的一个实例!编程语言
2,建立类函数
python中,定义一个类,和在PHP中定义一个类同样,都是采用 class 关键字,可是其定义方式确实有些特殊,看下面的例子:spa
约定俗称的,类的命名,咱们采用“驼峰法”而且首字母要大写。设计
python 中 采用 class 关键字表示要定义一个类,后面的括号中表示这个类是从哪一个类继承而来的,一般状况下,要是你找不到一个合适的类继承,那么就继承自最顶层的 object 吧,这却是和 java 中有些类似。code
定义完类以后就是定义类的方法,也就是这个车有哪些功能。类的方法和函数定义没有什么区别,只是在类中,方法要求你必须设置一个 self 参数,并且该参数始终位于方法形参列表的第一个。固然了,形参要求你这么来写,可是在调用的时候你却并不须要手动去传递这个参数。
python 类的实例化和其它编程语言有些不同,不须要使用 new 关键字,其它的没有区别。
python 中调用类的方法及方法参数的传递,一样和其它编程语言没有区别。
3,访问限制
如今,咱们来定义一个比较复杂一点的车类,就像是这样:
如今这个类,它具备了车该有的功能和相应的属性。一样的,咱们经过类的对象或者叫作实例,在类的外面能够访问到类对应的属性和其方法。
可是做为一个类,应该具有最基本的封装性,对于属性和一些敏感方法,不该该在类的外面能够直接访问,应该将其私有化。
Python 中并无提供像PHP中的关于访问权限的关键字,例如 private,它经过在属性或者方法名以前增长一个“双下划线”来标识,该属性或者方法,在类的外部不可以被直接访问,就像是这样:
在之后的python编程中,你会碰到变量名前面带有“单下划线”的变量,那么它的含义是表示该变量虽然能够被外部直接访问,可是最好不要那么作。
固然,对于python中的私有属性或者方法,难道只要带了“双下划线”就必定不能够在类的外部被访问到吗?
其实不是的,对于“私有”属性或者方法,Python只是对它们进行了重命名,这样你直接调用它的时候就会产生找不到的假象,但实际上你是能够访问到的,就像这样:这也是Python重命名的通用规则,在“私有”变量名以前增长“_ClassName”
你看,是否是就访问成功了呢?
实际上,python并不会阻止你在程序中作任何的坏事,相反它对你不做任何的限制,为了就是让全部的责任都让程序员本身来承担,有助于你编写出严谨的程序代码!(总以为,其实也不那么好 。。。。)
4,设置器与访问器
若是你知道java中的“豆子”这个东西,那么对于设置器和访问器应该就不会陌生,由于这个东西,我头一次据说就是在java中。
它的大概思想是,针对类中的每个私有的属性,若是想要被类外部的对象可以访问和修改,那么就必须针对这个属性产生两个共有的方法,这样对象就能够调用这两个方法来达到修改和访问私有属性的目的。
因为,这种东西只是一种思想,而并不是编程语言的特殊实现,所以在python中也能够轻松的模拟:
在这里,咱们把“setColor”和“getColor”方法,分别称做是 Car 类中 私有属性 color 的设置器和访问器。
固然了,安装约定俗成的规定,对于属性的设置器的命名规范是“set”加上它的属性名,一样的访问器就是“get”加上属性名。
其实,上面的案例已经达到了咱们想要的效果,那在java中,这就是实现好了。可是在python中却还要再追求一点简单,因而就出现了 “@property”这个东西。
先看一个案例:
这样,对于“私有属性 __color”,能够定义其对应的能够供外部对象调用的方法“color”,在这个“color 方法”上使用了 @property 装饰器以后,这个方法就变成了属性“color”的访问器。若是你还想给属性“color”加一个设置器,那么就能够采用图上的方式。
当采用 @property 的方式实现了属性的访问器和设置器以后,本来的私有属性,在外面就能够自由的以属性的方式访问了!
5,继承,构造方法,多态
通过上面知识的大概说明,对于python的面向对象编程,其实有了一个大概的影像。以一个类的方式,编写一些简单的功能,仍是可以实现的。
不过对于OOP而言,继承,绝对是重中之重。因此,下面的案例就演示了 python 中的继承:
python 中的继承,是在定义类的时候在后面的“()”中指定的。
在开始的时候,就说过,在定义 Car 类的时候,若是没有合适的继承类那么就继承自 object 类,由于这个是 python 中全部对象的顶层类。
那如今,我本身定义的 Bicycle 类则是继承自自定义的 Car 类,继承的语法规则就是那样。
代码桩:python 中对于一个空函数,或者空的类,须要使用 pass 来占位。不然会报错!这个大概是为了 python 中没有“{}”而作的补充,固然了,这里能够叫作“代码桩”也能够叫作“占位符”
在讲多态以前,咱们先看一下怎么样使用python的构造方法:
python中的构造方法叫:__init__ 好像挺贴切!
对于继承,若是子类也有对应的构造方法,那么就须要显式的调用父类的构造方法,调用父类的构造方法采用的方式和java中却是有些相像,所以都是用 super 函数实现:
#-*- coding:utf-8 -*- class Car(object): __color = None def __init__(self, color): self.__color = color @property def color(self): return self.__color class Bicycle(Car): __width = None def __init__(self, width, color): super(Bicycle, self).__init__(color) self.__width = width @property def width(self): return self.__width b = Bicycle(12,"blue") print b.color print b.width
多态是OOP编程中的一种设计思想,它是以OOP的继承特性为基础来实现的,这里跟python的基本特性相关不大,并且要描述清楚,仍是有些代码要写,限于博文太长,仍是先跳过!
6,补充知识
这里涉及到python中的几个魔术方法:
__str__ : 设置类的对象信息
__getattr__ 或者 __getattribute__ :用来设置,当经过对象访问不存在的属性时,调用的方法
__call__ : 能够把对象当作函数来直接调用。感受用处不大!
-----------------------------------------------下篇写异常--------------------------------------------------
感受,仍是 eclipse+pydev这个开发环境好些,PyCharm,真心感受有些渣!