一. 什么是面向对象?
1. 在了解面向对象之前,首先我们需要知道两个概念:
(1)什么是函数?
函数是对功能或动作的一种封装.
函数的语法结构如下:
def func(arg1): '''函数的内部有函数体''' print("这里是函数内部") func(arg2)
上面的结构中, func是函数名, arg1是形参, 在函数的内部是函数体. 在定义了函数以后, 我们只需要在下面 用函数名接上一个小括号( func() ) 就可以调用函数了, 小括号内部的 arg2 表示实参.
(2)什么是变量?
在程序设计中, 变量是一个可以存储值的字母或名称, 它是程序运行过程中产生的值, 被用来提供给后面的程序使用. 如 a = 10, 我们把 10 这个值赋给变量 a.
2. 面向过程与面向对象
在了解了以上两个概念以后, 我们现在可以开始讨论什么是面向对象了.
(1)从我们最初接触编程开始, 我们就使用一些关键词, 诸如 if, else, while 等等, 来帮助我们规范程序的逻辑, 按照我们的想法使程序运行下去. 实际上, 这种编程思想就是"面向过程", 我们可以用更加正式的语言来描述面向过程:
面向过程: 一切以事物的流程为核心. 根据业务逻辑(即事物的发展过程, 动作的先后顺序)从上到下写垒代码, 其核心在于"流程(过程)".
优点: 把一个事件步骤化,流程化, 程序编写相对简单.
缺点: 可扩展性差(甚至可以说是极差).
(2)于是我们现在引出一个概念 -- 面向对象.
面向对象: 一切以对象为中心. 对象是属性和动作的集合体. 面向对象就是指对函数进行分类和封装.
优点: 可扩展性强(体现在继承和多态上)
缺点: 编程的复杂程度高于面向过程
简单来说, 最开始接触编程时, 我们的思维,我们的思想是 专注于事物发展过程,动作先后顺序的. 然而, 面向对象却与之截然不同, 这种思维专注于事物这个对象本身, 处于这种思维之下, 可以认为世间万物皆是对象. 我们曾经关注的那些事物的动作和发展顺序, 在面向对象的思维中, 他们都是对象的属性, 于是, 无数包含着各种属性的对象就组成了我们的整个世界.
二. 什么是面向对象编程?
1. 类(Class)
类(Class): 用来描述具有相同的属性和方法的对象的集合体. 它定义了该集合体中每个对象所共有的属性和方法. 对象是类的实例.
class Foo: pass # class -- 关键字, 表示创建类 # Foo -- 类名
2. 实例化
实例化:创建一个类的实例,类的具体对象
class Foo: def __init__(self, property1, property2) self.property1 = property1 self.property2 = property2 obj = Foo("属性1", "属性2") # Foo() -- 类的实例化 # obj = Foo() -- 把Foo实例化为obj, obj被称为实例对象(简称为"对象") # "属性1", "属性2" 分别被传给参数 property1, property2
3. 成员
成员: 在类中定义的变量和方法都被称为成员.
成员分类: 变量, 方法, 属性
class Foo: class_variable = "这里是类变量" def __init__(self, property): """__init__用于初始化一个类""" self.property = property self.instance_variable = "实例变量" """这里的self.xxx都属于实例变量""" def instance_method(self): """实例方法必须有参数self""" print("这里是实例方法") @classmethod def class_method(cls): """类方法必须有参数cls,这里cls传递的是类名Foo""" obj = cls("普通属性") print("这里是类方法", obj) @staticmethod def static_method(): """静态方法对参数没有固定要求,根据实际需要即可""" print("这里是静态方法") @property def dynamic_property(self): return "这里是动态属性"