概述
- 面向过程:根据业务逻辑从上到下写垒代码
- 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
- 面向对象:对函数进行分类和封装,让开发“更快更好更强...”
在之前已经接触过了面向过程和函数式的编程,还有那么今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)
创建类和对象
面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。
类就是一个模板,模板里可以包含多个函数,函数里实现一些功能(把一类事物的相同特征和动作整合到一起就是类)
对象则是根据模板创建的实例,通过实例对象可以执行类中的函数(就是基于类而创建的一个具体的事物(具体存在的))
在这里举一个小例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 创建类 class Foo: def Bar( self ): print \'Bar\' def Hello( self , name): print \'i am %s\' % name # 根据类Foo创建对象obj obj = Foo() obj.Bar() #执行Bar方法 obj.Hello( \'wupeiqi\' ) #执行Hello方法 |
面向对象:【创建对象】【通过对象执行方法】
函数编程:【执行函数】
应用的场景不同造成的编程方式也不同,总结:函数式的应用场景 --> 各个函数之间是独立且无共用的数据
这里再对面向对象再进行一下细分:
1、面向对象不是所有情况都适用
2、面向对象编程
a 定义类
class Foo:
def 方法1(self,bb):
pass
obj = Foo(bb)
b 根据类创建对象(创建一个Foo类的实例)
可以使用对象去执行类中的方法
3、self,形式参数,代指执行方法的对象。python内部自动传递
4、类+括号 => 自动执行类中的 __init__方法: 创建了一个对象
在__init__ 有一个特殊名字:构造方法
==》 初始化
__del__ 解释器销毁对象时候自动调用,特殊的名: 析构方法
静态属性,静态方法,类方法,组合
静态属性的作用 将函数属性伪装成数据属性(封装逻辑)
用法 在方法(函数属性)上面加 @property
1 class Desk: 2 def __init__(self,name,width,length,heigh): 3 self.name = name 4 self.width = width 5 self.length = length 6 self.heigh = heigh 7 @property # 静态 将函数属性伪装成数据属性 8 def cal_area(self): 9 x = "立方厘米" 10 return self.length*self.width*self.heigh,x 11 12 d1 = Desk("舒克",20,50,10) 13 print(d1.cal_area) 14 15 (10000, \'立方厘米\')
静态方法 跟类和实例无关系,名义上归属类管理,但不能使用类变量和实例变量
用法 在方法(函数属性)上面加 @staticmethod
特点: 只能使用静态变量, 所以始终占用同一个内存, 执行效率更高, 但不会被自动回收.
1 class Desk: 2 def __init__(self,name,width,length,heigh): 3 self.name = name 4 self.width = width 5 self.length = length 6 self.heigh = heigh 7 @staticmethod # 用函数修饰符来声明静态方法 8 def cal_area(): 9 print("我跟类和实例没有任何关系哦!") 10 11 12 13 # 静态方法不能调用类和实例的属性
类方法 不需要self参数,自动加cls参数,python底层自动传入类对象。
跟实例没有关系,类自己调用;只能访问类的属性,不能访问实例属性
用法 在方法(函数属性)上面加 @classmethod