面向对象:
面向对象的程序设计的核心是对象(相当于你要处于创造者的思维来建立一个新的东西,如你要实现什么东西,需要干什么才能创造出来),要理解对象为何物。面向对象的程序设计好比作者写小说,作者要解决的问题就是使主角从一个屌丝升级到大神的故事,作者觉得要让主角成为大神,会给主角铺垫从弱到强的大纲,主角很弱时和逐渐变强的时候都有不同的特征,如刚开始只是一个学生,接着职员,接着创业(这就是对象的概念,时期和特征分别对应对象的属性和方法,学生时期对应好好学习。。。),然而作者觉得这个有成神过程有点枯燥,作者又给主角安排的各种敌对对象,为了防止主角半路挂了,又安排了一堆兄弟朋友保驾护航,这些都是对象。然后故事开始,主角经历了各种风雨最后成神。作者根本不会管主角按照什么流程成神。
优缺点:
优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。
应用场景:
需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。
# 在python 中面向对象的程序设计并不是全部。 # 面向对象编程可以使程序的维护和扩展变得更简单,并且可以大大提高程序开发效率 ,另外,基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。 # 了解一些名词:类、对象、实例、实例化 # 类:具有相同特征的一类事物(人、狗、老虎) # 对象/实例:具体的某一个事物(隔壁阿花、楼下旺财) # 实例化:类——>对象的过程
面向过程:
面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。
优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。
缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。
PASS
类和对象:
类是对一群具有相同特征或行为的食物的一个统称,是抽象的,特征被称为属性,行为被称为方法
对象是由类创建出来的一个具体存在,是类的实例化
# 创建类 -- 关键字 class # 格式: # class 类名: # 属性名 = 属性值 # def 方法名(self): # 行为 class Person: nationality = 'China' # 国籍是中国 # 这是静态属性,定义好后,无法通过方法来修改该属性 def walk(self): # 定义方法,必须带一个self参数,当函数放到一个类里,这个函数就叫方法---也叫动态属性 print('Person is walking...',self) print(Person.nationality) # 打印静态属性 print(Person.walk(1)) # 这个输出后多一个None,是因为没有实例化,类的返回值是None
实例化:
类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征。
实例化的过程就是类--->对象的过程
格式:对象名 = 类名(参数)
# 实例化 class Person: nationality = 'China' def __init__(self,personname): self.name = personname # 属性 def walk(self): print('%s is walking...,国籍是%s'%(self.name,self.nationality)) personname = Person('Jerry') # 实例化 # 类名()就等于在执行Person.__init__() # 执行完__init__()就会返回一个对象。这个对象类似一个字典,窜着属于这个对象的一些属性和方法 print(Person.nationality) # 查看属性 print(personname.name) # 直接查看属性:对象名.属性名 print(Person.walk) # 引用的是方法,这里不是在调用 Person.walk(personname)# 这是调用方法 personname.walk() # 调用类里的方法 # 等同于Person.walk(personname) # 以后调用方法都是以这种形式调用
关于self
self:在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给他起个别的名字,但是正常都不会这么做,这是约定俗成的。
类属性的补充
一:我们定义的类的属性到底存到哪里了?有两种方式查看 dir(类名):查出的是一个名字列表 类名.__dict__:查出的是一个字典,key为属性名,value为属性值 二:特殊的类属性 类名.__name__# 类的名字(字符串) 类名.__doc__# 类的文档字符串 类名.__base__# 类的第一个父类(在讲继承时会讲) 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲) 类名.__dict__# 类的字典属性 类名.__module__# 类定义所在的模块 类名.__class__# 实例对应的类(仅新式类中)
面向对象小结——定义及调用的固定模式
class 类名: def __init__(self,参数1,参数2): self.对象的属性1 = 参数1 self.对象的属性2 = 参数2 def 方法名(self):pass def 方法名2(self):pass 对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西 #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法 #括号里传参数,参数不需要传self,其他与init中的形参一一对应 #结果返回一个对象 对象名.对象的属性1 #查看对象的属性,直接用 对象名.属性名 即可 对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可