Python学习【第12篇】:初始面向对象
一、面向过程:面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西。
优点:极大地降低了写成学的复杂度,只需要顺着执行的步骤,堆叠代码即可
缺点:一套流水线或者流程就是用来解决一个问题,如果修改代码就都得改变
二、面向对象:上帝的思想
优点:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。
缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,这个游戏就失去平衡。
三、类:是具有相同特征的一类事物(人,狗,老虎)
对象/实例:具体的某一事物
实例化:类到对象的过程(实例=类名(参数1,参数2))
四、初始类和对象
类的定义:class Person: #class 类名:注意类名后面不要括号
类体
在python中,用变量表示特征,用函数表示技能,因而具有相同的特征和技能的一类事物就是‘类’,
对象则是这一类事物中具体的一个
类的两种作用:属性引用和实例化
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 class Person:
2 role = '中国人' #类属性----静态属性
3 def walk(self): #这里的函数叫做方法-----动态属性
4 #注意:self必须写
5 print('person is walking ...')
6 print(Person.role) #查看类属性
7 print(Person.walk) #查看类方法 , 用类名去调用方法名,打印出来的是内存地址
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 class Person:
2 role = '中国人'
3 def __init__(self,name,sex):
4 self.name=name
5 self.sex=sex
6 def walk(self):
7 print('person is walking')
8
9 hy = Person('haiyan',21) #实例化:类名(参数1,参数2) 类名()就等于在执行Person.__init__()
10 print(hy.name) #直接查看属性 对象名.属性名
11 print(hy) #返回的是一个对象
12 hy.walk() #调用方法 ,对象名.方法()
对象的两种作用:查看属性和调用方法(咋上面的实例化中讲到)
五、关于self
self:在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给它起个别的名字,但是一般正常人都不会这么做,因为你改了别人就不认识了。
注意:def __init__(self): 这句话可以写也可以不写,只要有参数参进来的时候就必须得写
def 方法名(self):这里的self必须得写
六、特殊的类属性
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 print(Person.__name__,type(Person.__name__)) #查看类的名字(这里的类名是字符串类型的)
2 print(Person.__dict__) #查出的是一个字典,key为属性名,value为属性值
3 print(Person.__doc__)# 就是把注释显示出来
4 print(dir(Person)) #查看类的方法,以列表的形式显示出来
5 print(Person.__module__) #类定义所在的模块
6 print(Person.__class__)
7 print(isinstance(hy,Person))#判断对象 是否是类的实例
七、对象的相关知识
1.对象是关于类而实际存在的一个例子,即实例
2.对象/实例只有一种作用:属性引用
1
2
3
4
|
egg = Person( 'egon' , 10 , 1000 ) print (egg.name) print (egg.aggressivity) print (egg.life_value)<br>当然,你也可以引用一个方法,因为方法也是一个属性。 |
八、面向对象小结
定义及调用的固定格式
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 class 类名:
2 def __init__(self,参数1,参数2):
3 self.对象的属性1 = 参数1
4 self.对象的属性2 = 参数2
5
6 def 方法名(self):pass
7
8 def 方法名2(self):pass
9
10 对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西
11 #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
12 #括号里传参数,参数不需要传self,其他与init中的形参一一对应
13 #结果返回一个对象
14 对象名.对象的属性1 #查看对象的属性,直接用 对象名.属性名 即可
15 对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可
16
17 小结
九、对象之间的交互
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 class Person:
2 def __init__(self,name,aggr,life_value):
3 self.name=name
4 self.aggr=aggr
5 self.life_value=life_value
6 def attack(self,dog): #人可以攻击狗
7 dog.life_value=dog.life_value-self.aggr
8 class Dog:
9 def __init__(self,name,aggr,life_value):
10 self.name = name
11 self.aggr = aggr
12 self.life_value = life_value
13
14 def attack(self,egg): #狗也可以攻击人
15 egg.life_value = egg.life_value - self.aggr
16 egg = Person('egon',250,1000)
17 dog = Dog('乐乐',50,2000)
18 print('狗没攻击前egon的生命值:',dog.life_value) #没攻击前egon的生命值
19 egg.attack(dog) #让egon去攻击狗乐乐
20 print('狗攻击后egon的生命值:',dog.life_value) #攻击后egon的生命值
21
22
23 print('egon没攻击前狗的生命值:',egg.life_value) #没攻击前egon的生命值
24 dog.attack(egg) #让狗去攻击egon
25 print('egon攻击后狗的生命值:',egg.life_value) #攻击后egon的生命值
十、类命名空间与对象,实例的命名空间
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字成为类的属性
而类有两种属性:静态属性和动态属性
- 静态属性就是直接在类中定义的变量
- 动态属性就是定义在类中的方法