1,面向对象与面向过程
1)
优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。
缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。
2)
优点:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经 常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。
应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。
总结:
。
2,类与对象
1)类:具有相同特征的一类事物(人、狗、老虎)
2)对象/实例:具体的某一个事物(隔壁阿花、楼下旺财) #对于python来说万物皆对象,dict是类,而dic={'k':v}就是对象。list是类,而l =[1,2]则是对象
实例化:类——>对象的过程。类是一个抽象的特征,由抽象到具体的过程叫做实例化。
python中的类与对象放在哲学里就是具体与抽象,具体---就是对象,抽象-----就是类。
在python中,用变量表示特征,用函数表示技能,因而具有相同特征和技能的一类事物就是‘类’,对象是则是这一类事物中具体的一个。
3,类
1,声明类
<span style="color: #008000">#<span style="color: #008000">我们创建一个类
<span style="color: #0000ff">class<span style="color: #000000"> Data:
<span style="color: #0000ff">pass
Person:
role = 创造了一个只要是这个类就一定有的属性
walk(self):
()
class Person: # 类名 country = 'China' # 创造了一个只要是这个类就一定有的属性 # 类属性 静态属性 def __init__(self,*args): # 初始化方法,self是对象,是一个必须传的参数 # self就是一个可以存储很多属性的大字典 self.name = args[0] # 往字典里添加属性的方式发生了一些变化 self.hp = args[1] self.aggr = args[2] self.sex = args[3]
4,类有两种作用:属性引用和实例化
1)属性引用(类名.属性)
在类的名字后面输入 .,IDE就会自动联想出我们之前定义类的时候写在里面的属性,而这就是类属性的引用。
Person:
role =
walk(self):
(<span style="color: #0000ff">print(Person.role) <span style="color: #008000">#<span style="color: #008000">查看人的role属性
<span style="color: #0000ff">print(Person.walk) <span style="color: #008000">#<span style="color: #008000">引用人的走路方法,注意,这里不是在调用
2)实例化:类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征
按我的理解实例化的过程就是:
Person:
role =
= name
<span style="color: #0000ff">def</span> walk(self): <span style="color: #008000">#</span><span style="color: #008000">人都可以走路,也就是有一个走路方法</span>
<span style="color: #0000ff">print</span>(<span style="color: #800000">"</span><span style="color: #800000">person is walking...</span><span style="color: #800000">"</span><span style="color: #000000">)
<span style="color: #0000ff">print(Person.role) <span style="color: #008000">#<span style="color: #008000">查看人的role属性
<span style="color: #0000ff">print(Person.walk) <span style="color: #008000">#<span style="color: #008000">引用人的走路方法,注意,这里不是在调用
语法:对象名 = 类名(参数)
egg = Person()
3)查看属性&调用方法
print(egg.name) #查看属性直接 对象名.属性名 print(egg.walk()) #调用方法,对象名.方法名() 4)关于self self:在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给他起个别的名字 5)补充
二:特殊的类属性
类名.<span style="color: #800080">name<span style="color: #008000">#<span style="color: #008000"> 类的名字(字符串)
类名.<span style="color: #800080">doc<span style="color: #008000">#<span style="color: #008000"> 类的文档字符串
类名.<span style="color: #800080">base<span style="color: #008000">#<span style="color: #008000"> 类的第一个父类(在讲继承时会讲)
类名.<span style="color: #800080">bases<span style="color: #008000">#<span style="color: #008000"> 类所有父类构成的元组(在讲继承时会讲)
类名.<span style="color: #800080">dict<span style="color: #008000">#<span style="color: #008000"> 类的字典属性
类名.<span style="color: #800080">module<span style="color: #008000">#<span style="color: #008000"> 类定义所在的模块
类名.<span style="color: #800080">class<span style="color: #008000">#<span style="color: #008000"> 实例对应的类(仅新式类中)
<span style="color: #000000">
类属性的补充
5,对象的相关知识
Person:
role =
<span style="color: #0000ff">def</span> <span style="color: #800080">__init__</span><span style="color: #000000">(self,name,aggressivity,life_value):
self.name </span>= name <span style="color: #008000">#</span><span style="color: #008000"> 每一个角色都有自己的昵称;</span>
self.aggressivity = aggressivity <span style="color: #008000">#</span><span style="color: #008000"> 每一个角色都有自己的攻击力;</span>
self.life_value = life_value <span style="color: #008000">#</span><span style="color: #008000"> 每一个角色都有自己的生命值;</span>
<span style="color: #0000ff">def</span><span style="color: #000000"> attack(self,dog):
</span><span style="color: #008000">#</span><span style="color: #008000"> 人可以攻击狗,这里的狗也是一个对象。</span>
<span style="color: #008000">#</span><span style="color: #008000"> 人攻击狗,那么狗的生命值就会根据人的攻击力而下降</span>
dog.life_value -= self.aggressivit</pre>
1)对象是关于类而实际存在的一个例子,即实例
2)对象/实例只有一种作用:属性引用
3)调用和定义的固定模式
==</span><span style="color: #0000ff">def</span> 方法名(self):<span style="color: #0000ff">pass</span>
<span style="color: #0000ff">def</span> 方法名2(self):<span style="color: #0000ff">pass</span><span style="color: #000000">
对象名 = 类名(1,2) <span style="color: #008000">#<span style="color: #008000">对象就是实例,代表一个具体的东西
<span style="color: #008000">#<span style="color: #008000">类名() : 类名+括号就是实例化一个类,相当于调用了init方法
<span style="color: #008000">#<span style="color: #008000">括号里传参数,参数不需要传self,其他与init中的形参一一对应
<span style="color: #008000">#<span style="color: #008000">结果返回一个对象
对象名.对象的属性1 <span style="color: #008000">#<span style="color: #008000">查看对象的属性,直接用 对象名.属性名 即可
对象名.方法名() <span style="color: #008000">#<span style="color: #008000">调用类中的方法,直接用 对象名.方法名() 即可
6,面向对象的交互
不同的对象之间进行交互——人,狗大战。
====
person.blood -=<span style="color: #0000ff">class<span style="color: #000000"> Person:
<span style="color: #0000ff">def <span style="color: #800080">init<span style="color: #000000">(self,sex):
self.name =<span style="color: #000000"> name
self.blood =<span style="color: #000000"> blood
self.aggr =<span style="color: #000000"> aggr
self.sex =<span style="color: #000000"> sex
<span style="color: #0000ff">def<span style="color: #000000"> attack(self,dog):
dog.hp -=<span style="color: #000000"> self.aggr
<span style="color: #0000ff">if dog.hp <=<span style="color: #000000"> 0:
<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">%s打了%s,%s被打死了,扑街~~~<span style="color: #800000">'%<span style="color: #000000">(self.name,dog.name,dog.name))
<span style="color: #0000ff">else<span style="color: #000000">:
<span style="color: #0000ff">print(<span style="color: #800000">'<span style="color: #800000">%s打了%s,掉了%s血<span style="color: #800000">'%<span style="color: #000000">(self.name,self.aggr))