标签:用户 体系 设置 close 多态 分解 ima ... opened
程序设计的由来
面向对象介绍以及诞生原因
面向对象的程序的构成
面向对象的三大特性
转自http://www.cnblogs.com/linhaifeng/articles/6428835.html
1)编程的几种方式
我们知道编程方式分为面向过程编程、函数式编程、以及面向对象编程,刚开始我们接触编程时所写的代码都是面向过程;
面向过程的程序设计:核心是过程,指的是解决问题的步骤,比如先干什么再干什么;这种设计好比精心设计好的一条流水线,是一种机械式的思维方式;
优点:复杂度的问题流程化,进而简单化;
缺点:几乎没有可扩展性,程序只要稍微改动则牵制全身;
函数式编程的设计:把问题分解为一个函数的集合,函数仅接受输入并产生输出,不包含任何能影响产生输出的内部状态。任何情况下,使用相同的参数调用函数始终能产生同样的结果。
优点:逻辑可证;模块化;易于调试;代码重复利用;
缺点:所有的数据都是不可以改变的,严重占用运行资源,导致运行速度也不够快
2)关于面向对象编程;
面向对象的程序设计:核心是对象,对象是特征和技能的结合体,基于面向对象设计程序就好比在创造一个世界,你就是这个世界的上帝,存在的皆为对象,不存在的也可以创造出来,与面向对象机械式的思维方式形成鲜明对比。
优点:解决了程序的可扩展性,对某一个对象单独修改,会立刻反应到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易;
缺点:编程的复杂度高;无法像面向过程的程序设计流水线式的可以很精确的预测问题的处理流程和结果;面向对象的程序一旦开始就是对象之间的交互解决问题,即便是上帝也无法精确预测最终结果;
应用场景:需求经常变化的软件,一般需求的变化都集中在用户层、互联网应用、企业内部软件、游戏等都是面向对象设置的好地方;
对于一个软件质量来说,面向对象的程序设计只是用来解决扩展性的;
3)面向对象诞生的原因:
请参考程序设计的由来。
面向对象程序包含了类和对象;
1)什么是类?如何写一个类?
类的定义:类就是类别、种类的意思,是面向对象设计最重要的概念,类就像是一个模板,类是一系列对象相似的特征与技能的结合体;比如:我们每个人都有相同的结构(身体构造),相同的功能(吃喝拉撒跑),那么,我们可以说都是由人的这个类所创建出来的。
类的编写:
#格式: class 类名: def __init__(self): pass def func1(): pass def func2(): pass . . . . . . #类里面的函数,我们称之为方法; #__init__方法意思为对象定制自己独有的特征
类的作用:属性引用和实例化;
class Person: #定义一个人类 role = ‘person‘ #人的角色属性都是人 def walk(self): #人都可以走路,也就是有一个走路方法 print("person is walking...") print(Person.role) #查看人的role属性 print(Person.walk) #引用人的走路方法,注意,这里不是在调用
class Person: #定义一个人类 role = ‘person‘ #人的角色属性都是人 def __init__(self,name): self.name = name # 每一个角色都有自己的昵称; def walk(self): #人都可以走路,也就是有一个走路方法 print("person is walking...") print(Person.role) #查看人的role属性 print(Person.walk) #引用人的走路方法,注意,这里不是在调用
实例化的过程其实就是在创建对象,我们稍后介绍对象;
关于类方法中的self参数:
self:在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给他起个别的名字,但是正常人都不会这么做;
2)什么是对象,对象如何产生,如何使用?
对象的定义:对象是特征和技能的结合体,比如,每个人都可以作为人类的一个对象,世间万物皆如此,所以,世间万物皆为对象;
在现实中:现有对象,由对象的基本特征总结出了类;
在程序中:现有类,定义类之后,在根据类实例出一个个具体的对象;
对象的产生:
对象是由类实例化产生的;也可以说类是虚拟的,对象是实实在在存在的;
class person(): #定义一个类 def __init__(self,name,age): 类的函数属性 self.name = name self.age = age def like(self,love): 类的数据属性 print("%s今年%s岁了,喜欢%s" % (self.name,self.age,love)) ren = person("小张",20) #根据person实例化一个对象,也就是创建一个对象 ren.like("看书") #对象调用方法; --------------------- 输出结果 --------------------------------------------------- 小张今年20岁了,喜欢看书 #类的函数属性只的是每个对象的特殊属性,比如每个人的名字,年龄都是不一样的,这就是他们的特殊属性,而类的数据属性,是公共属性,也就是说大家都可以看书;
4.面向对象的三大特性;
面向对象有三大特征:封装、继承、多态;
1)封装;
定义:封装,从本身意思去理解就是将某些东西放到一个容器里装起来。函数的作用就是将某个功能进行封装到函数里,方便调用;而面向对象的封装就是将某些共性的函数(在类里我们称为方法)封装在一个类里,方便查找使用,我们称为归类;还有一层意义就是隐藏;通过__下划线方式将属性隐藏起来,设置成私有的。
核心:将相关功能封装到一个类中,将数据封装到对象中;
2)继承;
定义:继承是一种创建新类的方式,新建的类可以继承一个或多个父类(python支持多继承),父类又称为基类或超类,新建的类称为派生类或子类。
子类会遗传父类的属性,也就是说当类在本身的类中找不到某方法或变量是,回去父类进行寻找,这样就解决了代码重用的问题;
继承分为单继承和多继承:
class zjk(): #person类的父类 def sport(self,sport): print("%s喜欢%s" % (self.name,sport)) class person(zjk): #定义zjk类为自己的父类 def __init__(self,name,age): self.name = name self.age = age def like(self,love): print("%s今年%s岁了,喜欢%s" % (self.name,self.age,love)) ren = person("小张",20) ren.sport("打球") #当ren这个对象调用sport时会先从自身的类(person)进行查找,如果自身的类中没有这个方法,则回去父类(zjk)中查找,并调用。
class zjk(): def sport(self,sport): print("%s喜欢%s" % (self.name,sport)) class zjk1(): def eat(self,eat): print("%s喜欢%s" % (self.name,eat)) class person(zjk,zjk1): def __init__(self,name,age): self.name = name self.age = age def like(self,love): print("%s今年%s岁了,喜欢%s" % (self.name,self.age,love)) ren = person("小张",20) ren.eat("吃水果") ------------------- 打印结果 ------------------------------------------------ 小张喜欢吃水果
由此,我们可以总结一下:多继承时的顺序,由左至右,一次查找;
3)多态;
定义:多态指的是一类事物有多种形态;
比如:动物有多种形态:人、狗、猪;这样实例出的对象也是不同的;
import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.abstractmethod def talk(self): pass class People(Animal): #动物的形态之一:人 def talk(self): print(‘say hello‘) class Dog(Animal): #动物的形态之二:狗 def talk(self): print(‘say wangwang‘) class Pig(Animal): #动物的形态之三:猪 def talk(self): print(‘say aoao‘)
比如:文件有多种形态:文本文件、可执行文件;
import abc class File(metaclass=abc.ABCMeta): #同一类事物:文件 @abc.abstractmethod def click(self): pass class Text(File): #文件的形态之一:文本文件 def click(self): print(‘open file‘) class ExeFile(File): #文件的形态之二:可执行文件 def click(self): print(‘execute file‘)
鸭子类型:
逗比时刻:
Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。
a:利用标准库中定义的各种‘与文件类似’的对象,尽管这些对象的工作方式像文件,但他们没有继承内置文件对象的方法
#二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用 class TxtFile: def read(self): pass def write(self): pass class DiskFile: def read(self): pass def write(self): pass
b.其实大家一直在享受着多态性带来的好处,比如Python的序列类型有多种形态:字符串,列表,元组,多态性体现如下
#str,list,tuple都是序列类型 s=str(‘hello‘) l=list([1,2,3]) t=tuple((4,5,6)) #我们可以在不考虑三者类型的前提下使用s,l,t s.__len__() l.__len__() t.__len__() len(s) len(l) len(t)
标签:用户 体系 设置 close 多态 分解 ima ... opened
原文地址:https://www.cnblogs.com/zhangjunkang/p/9542803.html