面向对象基本介绍
python编程方式
- 面向过程编程 (流水线式思维)
优点是:极大的降低了写程序的复杂度,只需要顺着要执行的步骤,堆叠代码即可。
缺点是:一套流水线或者流程就是用来解决一个问题,代码牵一发而动全身。
- 面向函数编程
封装代码,简化流程 但是本质上没有改变结果 是面向结果编程思想
- 面向对象编程
优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物
参数的特征和技能修改都很容易。
缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,
面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预
测最终结果。于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现
一刀砍死3个人,这个游戏就失去平衡。
名称定义
- 如果函数没有在类中称为'函数'
- 如果函数在了类中称之为方法
类和对象
python中一切皆为对象,类型的本质就是类,所以,不管你信不信,你已经使用了很长时间的类了
创建一个类:
# class Person: #定义一个类
# role = 'person' #类的属性
# def attack(self):#定义方法 就是定义函数 这个函数就是这个类的方法
# print('attack')#调用类打印的结果
# # pass
# print(Person.role)
# print(Person.attack)#现在这个函数是类里面的方法了
- 类里面所有的方法就是函数 函数里必须传的参数就是self 这个参数是个形参这个方法函数
- 必须定义在类的里面 先定义类的属性 再定义类的方法
- 方法是定义在类的里面 但是真正调用类的方法的是 实例化的对像
实例化一个对象
- 实例化 一个对象 把类的属性 赋予给 对象 就是实例化对象
- 类加上括号() 得到的结果就是一个实例,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征
- 实例就可以调用类的方法agen=Dog('egon','male',250,200)#这就是一个实例化的对象
- alex.attack() #当你用一个是实例化的对象去掉用一个类的方法的时候,自动的传一个参数,这个参数就是对象本身
class Dog:
role='dog' #类的属性 , 静态属性 所有的对象 共用|有的属性,可以直接被类调用
def __init__(self,name,sex,aggressive,blood):#可以传默认参数
# 对象属性 属性 用于实例化一个对象之后 调用
self.name=name
self.sex=sex #性别
self.aggressive=aggressive #攻击力
self.blood=blood #血量
def attack(self):
print('%s attack'%self.name)
agen=Dog('egon','male',250,200)
alex=Dog('alex','male',25,2000)
print(agen.name)
agen.attack()
alex.attack()
语法 查看 调用
语法:对象名 = 类名(参数)
egg = Person('egon') #类名()就等于在执行Person.__init__() #执行完__init__()就会返回一个对象。这个对象类似一个字典,存着属于这个人本身的一些属性和方法。 #你可以偷偷的理解:egg = {'name':'egon','walk':walk}
调用和查看
print(egg.name) #查看属性直接 对象名.属性名 print(egg.walk()) #调用方法,对象名.方法名()
小结--定义及调用的固定模式
class 类名: def __init__(self,参数1,参数2): self.对象的属性1 = 参数1 self.对象的属性2 = 参数2 def 方法名(self):pass
在类内调用对象的属性:self.属性名 def 方法名2(self):pass
在类内调用对象的属性:self.属性名 对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西 #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法 #括号里传参数,参数不需要传self,其他与init中的形参一一对应 #结果返回一个对象 对象名.对象的属性1 #查看对象的属性,直接用 对象名.属性名 即可 对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可
小结
几个名词
类 具有相同属性、和方法的一类事物
对象(实例) 具体的某一个人事物
实例化 对象=类 的过程
类的的定义 : class关键字 类名的首字母大写
类中有属性:
动态属性 方法
静态属性 类属性
对象的属性:
一开始的时候:通过init方法初始化来的
在类内调用对象的属性:self.属性名
在类外调用对象的属性:对象名.属性名
调用方法的时候:
对象.方法名
不必传的参数:self
当类实例化的时候:自动的触发__init__方法。实例化的时候类名(参数),这个参数传给init方法
练习
# 练习题 class Porson: role='Porson' #类的属性 , 静态属性 所有的对象 共用|有的属性,可以直接被类调用 def __init__(self,name,age,sex):#可以传默认参数 # 对象属性 属性 用于实例化一个对象之后 调用 self.name=name self.age=age self.sex=sex #性别 def attack(self): print('%s,%s,%s 上山砍柴'%(self.name,self.age,self.sex)) def attack_1(self): print('%s,%s,%s 开车去东北'%(self.name,self.age,self.sex)) def attack_2(self): print('%s,%s,%s 最爱大保健'%(self.name,self.age,self.sex)) 小明=Porson('小明',8,'男') 老李=Porson('老李',99,'女') # print(agen.name) 小明.attack() 小明.attack_1() 小明.attack_2() 老李.attack() 老李.attack_1() 老李.attack_2()
对象间的交互
创建多个类 定义类的属性和实例化多个对象,定义多个方法和实现的结果
class Person: # 定义一个人类 role = 'person' # 人的角色属性都是人 def __init__(self, name, aggressivity, life_value): self.name = name # 每一个角色都有自己的昵称; self.aggressivity = aggressivity # 每一个角色都有自己的攻击力; self.life_value = life_value # 每一个角色都有自己的生命值; def attack(self,dog): # 人可以攻击狗,这里的狗也是一个对象。 # 人攻击狗,那么狗的生命值就会根据人的攻击力而下降 dog.life_value -= self.aggressivity class Dog: # 定义一个狗类 role = 'dog' # 狗的角色属性都是狗 def __init__(self, name, breed, aggressivity, life_value): self.name = name # 每一只狗都有自己的昵称; self.breed = breed # 每一只狗都有自己的品种; self.aggressivity = aggressivity # 每一只狗都有自己的攻击力; self.life_value = life_value # 每一只狗都有自己的生命值; def bite(self,people): # 狗可以咬人,这里的狗也是一个对象。 # 狗咬人,那么人的生命值就会根据狗的攻击力而下降 people.life_value -= self.aggressivity egg = Person('egon',10,1000) #创造了一个实实在在的人egg ha2 = Dog('二愣子','哈士奇',10,1000) #创造了一只实实在在的狗ha2 print(ha2.life_value) #看看ha2的生命值 egg.attack(ha2) #egg打了ha2一下 print(ha2.life_value) #ha2掉了10点血 egon大战哈士奇
import random class Person: role='游戏人物:' def __init__(self,name,lifevalue,aggr): self.name=name self.lifevalue=lifevalue self.aggr=aggr info_person = ''' ==================人物信息===================== 名称:%s 血量:%s 攻击:%s =============================================== ''' % (name, lifevalue, aggr) print(info_person) def attack(self,se): print('%s平A了%s一下'%(self.name,se.name)) life=int(int(se.lifevalue) - int(self.aggr)) se.lifevalue=life Monster(se.name,life,se.aggr) class Monster: role='怪物:' def __init__(self,name,lifevalue,aggr): self.name=name self.lifevalue=lifevalue self.aggr=aggr info_dog=''' ==================怪物信息===================== 名称:%s 血量:%s 攻击:%s =============================================== '''%(name,lifevalue,aggr) print(info_dog) def attack(self,se): print('%s反咬了%s一口'%(self.name,se.name)) life=se.lifevalue - self.aggr se.lifevalue = life Person(se.name,life,se.aggr) class Run: def __init__(self,name,lifevalue,aggr): self.name=name self.lifevalue=lifevalue-10 self.aggr=aggr info=''' ==================人物信息===================== 名称:%s 血量:%s 攻击:%s =============================================== '''% (name,self.lifevalue, aggr) print(info) monster_list=[('二哈',53,2),('史莱姆',53,5),('炸弹',10,100)] person_list=[('egon',50,5),('alex',100,3),('群主',30,8)] p_n_l=[] for i in person_list: p_n_list=''' ==================游戏人物===================== 名称:%s 血量:%s 攻击:%s =============================================== '''%(i[0],i[1],i[2]) p_n_l.append(i[0]) print(p_n_list) p_choice=input('选择游戏人物:') if p_choice in p_n_l: for line in person_list: if p_choice in line: person=Person(*line) def fighting(): print('开始游戏!') Tag=True while Tag: print('遇到怪物!战斗or逃跑') monster_c = random.choice(monster_list) monster = Monster(*monster_c) fight_cmd=input('选择指令:') if fight_cmd=='战斗': tag=True while tag: person.attack(monster) monster.attack(person) ran=random.randint(10, 700) if person.lifevalue<=0: print('%s获得胜利 %s吐血身亡'%(monster.name,person.name)) tag=False f_cmd=input('继续or退出') if f_cmd=='退出': Tag=False elif monster.lifevalue<=0: print('%s获得胜利 获得金钱:%s'%(person.name,ran)) f_cmd = input('继续or退出') if f_cmd == '退出': Tag = False tag = False elif fight_cmd=='逃跑': print('小伙子,你太怂了') print('逃跑成功! 血量-10') Run(person.name,person.lifevalue,person.aggr) Tag = False else: print('指令不存在!') fighting()的