面向过程:
根据业务逻辑从上到下写垒代码面向过程的设计的核心是过程,过程即解决问题的步骤, 面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西
优点:
极大降低了程序的复杂性
缺点:
一套流水线或者流程就是用来解决一个问题,生产汽车的流水线无法生产汽水,即便是改造也要大改,牵一发而动全身。
函数式:
将某功能代码封装到函数中,以后无需重复写代码,调用方便
面向对象: 对函数进行分类和封装,"更快更好更强"。 面向对象的程序核心是对象。如来安排唐僧,沙和尚,猪八戒,孙悟空去取经,但根本不会管师徒四人按照什么流程去取。 面向对象优点: 解决了程序的可拓展性。对某一个对象单独修改会立刻反映到整个体系中,如对一个人物的参数的特征和技能修改都很容易。
面向对象缺点: 可控性差,无法像面向过程的程序设计流水线式可以很精准的预测问题的处理流程和结果。面向对象的程序一旦开始就由对象之间的交互解决问题,即使是上帝也无法预测最终结果。
面向对象应用场景: 需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。
面向对象的程序设计并不是全部。对于一个软件质量来说,面向对象的程序设计只是用来解决扩展性。
创建“类”和“对象”
类——类就是一个模板,模板里可以包含多个函数,函数里实现一些功能。
对象——对象就是通过模板创建的实例,通过实例对象可以执行类中的函数。
面向对象是一种编程方式,此编程方式需要‘类’和‘对象’来实现,所有面向对象编程实际就是对‘类’和‘对象’的使用。
(纠正: 上图person = person() 应为 person = Person() )
class是关键字,表示类
创建对象类后面加括号即可
类中的函数第一个参数必须是self,类中定义的函数叫做‘方法’。
#创建类 class Person: def attack(self): print('attack') def hello(self,name): print('I am %s' %name) #根据类Person创建对象Person() person = Person() person.attack() #执行attack的方法 person.hello('zhugaochao') #执行hello的方法
面向对象:创建对象,通过对象执行方法。
函数编程:直接执行函数。
场景的不同适合其编程方式也不同。
函数式编程的应用场景 >>> 各个函数之间是独立且无共用的数据。
面向对象的三大特性
1.封装
封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。 所以,在使用面向对象的封装特性是
需要:
1.将内容封装到某处; 2.从某处调用被封装的内容。
1.1.将内容封装到某处
self是一个形式参数 当执行obj1 = Foo('zgc',18)时,self等于obj1 当执行obj2 = Foo('Joe',78)时,self等于obj2 (上图里不小心写错了)
So,内容其实被封装到了对象obj1和obj2中,每个对象都有name和age属性,在内存中类似下图保存。
1.2.从某处调用被封装的内容
(1).通过对象直接调用被封装的内容
上图展示了对象obj1和obj2在内存中保存的方式,根据格式可以如此调用被封装的内容:对象.属性名。
class Foo: def __init__(self,name,age): self.name=name self.age=age obj1=foo('zgc',18) print(obj1.name) #直接调用obj1对象的name属性 print(obj1.age) #直接调用obj1对象的age属性 obj2=foo('Joe',23) print(obj2.name) #直接调用obj2对象的name属性 print(obj2.age) #直接调用obj2对象的age属性(2).通过self间接调用被封装的内容
执行类中的方法时,需要通过self间接调用被封装的内容。
class Foo: def __init__(self,name,age): self.name=name self.age=age def detail(self): print(self.name) print(self.age) obj1=Foo('zgc',18) obj1.detail() #python默认会将obj1传给self参数,即obj1.detail(obj1),所以,此时方法内部的self=obj1,即self.name是zgc;self.age是18 obj2=Foo('Joe',23) obj2.detail() #python默认会将obj2传给self参数,即obj2.detail(obj2),所以,此时方法内部的self=obj2,即self.name是Joe;self.age是23综上所述,对于面向对象的封装来说,其实就是使用构造方法将内容封装到对象中,然后通过对象直接或者self间接获取被封装的内容。
在终端输出如下信息
小明,10岁,男,上山去砍柴
小明,10岁,男,开车去东北
小明,10岁,男,最爱大保健
老李,90岁,男,上山去砍柴
老李,90岁,男,开车去东北
老李,90岁,男,最爱大保健
老张...