Python-面向对象编程
一.编程范式
1.面向过程编程
面向过程把函数继续切分为子函数,来降低系统的复杂度。初学者容易接受,从上往下依次执行。
2.面向对象编程(OOP) Object Oriented Programming 对函数进行分类和封装....
面向对象编程——Object Oriented Programming,简称 OOP,把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
3.面向函数编程(lisp)
将某功能的代码封装为一个函数,使用时仅调用函数。
(2+3)*2-1 jian(multi(add(2,3),2),1)
二.基础概念
1.类: 在 Python 中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)。
OOP首选思考的不是程序的执行流程,而是某个数据类型应该被视为一个对象,这个对象拥有的属性(Property)。
2.object表示该类是从哪个类继承下来的。通常,如果没有合适的继承类,就使用 object 类,这是所有类最终都会继承的类。
class people: 经典类
class People(object): 新式类,object类是所有类的基类/父类
3.实例(Instance)则是一个个具体的 Student;
面向对象的抽象程度又比函数要高,因为一个 Class 既包含数据,又包含操作数据的方法。
- 创建实例的方式:student1 = Student()
- 可以自由地给实例变量绑定属性,student1.name,student1.score;
4.构造函数
def __init__(self,name,age): 构造函数,当实例化对象时自动调用
5.属性 self.name = name
6.方法: 给对象发消息实际上就是调用对象对应的关联函数,我们称之为对象的方法(Method)。
Class 是一种抽象概念,比如我们定义的 Class——Student,是指学生这个概念;
__init__ 方法的第一个参数永远是 self ,表示创建的实例本身;
- 在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self ,并且调用时,不用传递该参数。
- 可定义一个特殊的 __init__ 方法,在创建实例的时候,就把name , score等属性绑上去。
7.析构函数
删除实例化对象时自动调用;
def __del__(self):
print "deleteing......"
8.子类
class Student(People): Student是子类,继承People这个父类;
注:以上例子见下面数据封装的图示
三.面向对象的三个特性
1.数据封装
封装:把内容统一放在一个地方,看成一个整体,(实例化对象self和类的属性绑定在一起);
- 访问封装内容的两种方式:
通过self去访问封装的内容;(self.name)
通过实例化的对象名去访问封装的内容;
练习:
练习1:
创建一个类People,拥有的方法为砍柴,娶媳妇,回家;
实例化对象,执行相应的方法
显示如下:
老李,18岁,男,开车去娶媳妇
校思浩,22岁,男,上山去砍柴
唐浩,10岁,男,辍学回家
属性:name,age,gender
方法:goHome(), kanChai(),quXiFu()
2.继承
继承性:子承父业,继承遗产.对于面向对象的继承来讲,就是将多个类共有的方法提取到父类中去,而子类只需要继承
父类的方法,不需要一一实现每个方法;
1.几个概念:子类(派生类)和父类(基类),经典类和新式类
class D(object): 新式类
class D: 经典类
(1)继承属性的第一种方法,不推荐
如果父类名更改,此处也需要更改
(2)继承属性的第一种方法super,推荐
2.多继承
- python的类可以继承多个,Java和C#只能单继承;
- 继承多个类,有两种算法:深度优先算法和广度优先算法;
- 类为经典类(class C:)时,多继承时使用深度优先算法;
- 类为新式类(class C(C1,C2))时,多继承时使用广度优先算法;
eg: D, C(D), B(D), A(B,C)
深度优先:A->B->D->C
广度优先: A->B->C->D
3. 注意:类的方法中可以传递一个对象
(1)新式类(优先同级) 优先在C类中找
(2)新式类(优先同级) 优先在C类中找,C中没有再去D类中找
(3)经典类(优先上级) 优先在B类中找,B中没有再去B类的上级D类中找
(4)经典类(优先上级) 优先在B类中找,B中没有再去B类的上级D类中找,D类没有最后在到同级的C类中找
3.多态
就是多种表现形态的意思。它是一种机制、一种能力,而非某个关键字。它在类的继承中得以实现,在类的方法调用中得以体现。多态意味着变量并不知道引用的对象是什么,根据引用对象的不同表现不同的行为方式。
- 如果子类调用的方法,子类没有,父类有,运行父类;
- 如果子类调用的方法,子类有,父类也有,只运行子类的;
四.将两个子类做关联
五.访问限制
在 Python 中,实例的变量名如果以 __ 开头,就变成了一个私有变量(private);
当self.__age变为私有变量,等于_People__age _People__age = self.__age
本文转自一百个小排 51CTO博客,原文链接:http://blog.51cto.com/anfishr/1962496,如需转载请自行联系原作者