博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python开发面向对象基础:人狗大战学面向对象
阅读量:6599 次
发布时间:2019-06-24

本文共 7403 字,大约阅读时间需要 24 分钟。

一,通过函数写人狗大战这个故事

1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3  4 #1.函数  人模子 5 def person(name,level,life_value): 6     p_dic = { 7         'name':name, 8         'level':level, 9         'life_value':life_value10     }11     return p_dic12 joker = person('joker',100,4000)13 14 #函数  狗模子15 def dog(name,breed,live_value):16     d_dic = {17         'name': name,18         'breed': breed,  #(品种)19         'live_value': live_value20     }21     return d_dic22 dahei = dog('dahei','狼',10000)23 24 #函数  定义人的攻击25 def attack(person):   #定义人攻击26     print('%s在攻击'%person['name'])27 attack(joker)      #将Joker的返回值的字典传入,获取字典相应的值28 29 #函数  定义狗的攻击30 def bite(dog):      #定义狗攻击31     print('%s在咬'%dog['name'])32 bite(dahei)        #将dahei的返回值的字典传入,获取字典相应的值

 

 **上面的调用很完美但是如果出现下面的情况的话,你会分不清楚谁攻击,谁咬死

  attack(dahei)   #这个攻击是人的属性,狗也可以了

  bite(joker)     #这个攻击时狗的属性,人也可以了

二,通过嵌套函数去写

1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3  4 def person(name,level,life_value): 5     def attack():                             #把这个攻击定义在人里面 6         print('%s在攻击' %p_dic['name']) 7     p_dic = { 8         'name':name, 9         'level':level,10         'life_value':life_value,11         'attack':attack12     }13     return p_dic14 15 def dog(name,breed,live_value):16     def bite():                               #把这个攻击定义在狗里面17         print('%s在咬' % d_dic['name'])18     d_dic = {19         'name':name,20         'breed':breed,21         'live_value':live_value,22         'bite':bite23     }24     return d_dic25 26 joker = person('joker',100,4000)27 dahei = dog('dahei','狼',10000)28 joker['attack']()        #这样调用的话就没有问题了,字典方式调用29 dahei['bite']()

 

 **上面的函数嵌套很完美但是如果我想现在定义个吃,玩的属性,难道你要在每个嵌套函数里面加字典的kev么

 **注意:实现吃,玩的属性,不能在外面单独写吃的函数,因为不能确定谁去吃,写在里面又会出现代码重复的情况

三,面向对象的定义

1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3  4 class Person: 5     role = '中国人'    #属性—— 静态属性--类属性  例子中用不到 6     def __init__(self,name):  #传参 7         print('there here') 8         print(name) 9     def attack(self):  #方法——动态属性10         print('攻击')11 # print(Person.role)   #类名.属性12 # print(Person.attack) #类名.方法  打印出来的是内存地址13 # joker = Person()  #调用,首先执行init方法(构造函数) self就是joker14 # joker = Person('joker')   #有参数,init也是相对应得需要参数

 

3.1 上面代码解释成函数为

1 #!/usr/bin/env python 2 #_*_coding;utf-8_*_ 3  4 def Person(*args,**kwargs): 5     self = {} 6     def __init__(name,life_value,aggr): 7         self['name'] = name 8         self['life_value'] = life_value 9         self['aggr'] = aggr10         return self11     self_ret =  __init__(*args,**kwargs)12     return self_ret13 # joker =Person('joker',1000,500)

 

3.2 人人大战

1 #!/usr/bin/env python 2 #_*_coding;utf-8_*_ 3  4 class Person: 5     role = '中国人'    #属性—— 静态属性 6     def __init__(self,name,life_value,aggr): 7         self.name = name 8         self.life_value = life_value 9         self.aggr = aggr10     def attack(self,enemy):  #方法——动态属性,enemy对象,攻击谁11         enemy.life_value = enemy.life_value - self.aggr12 # egon = Person('egon',1000,50)13 # alex = Person('alex',250,5)14 # print(alex.life_value)15 # egon.attack(alex)16 # egon.attack(alex)        #egon攻击alex,alex血会减少,相当于改了实例里面的value17 # print(alex.life_value)18 # alex.attack(egon)        #alex攻击egon,egon血量会减少

 

四,面向对象人狗大战

1 #!/usr/bin/env python 2 #_*_coding;utf-8_*_ 3  4 class Person: 5     role = '中国人'    #属性—— 静态属性 6     def __init__(self,name,life_value,aggr): 7         self.name = name 8         self.life_value = life_value 9         self.aggr = aggr10     def attack(self,dog):  #方法——动态属性,enemy对象,攻击谁11         dog.life_value = dog.life_value - self.aggr12 13 class Dog:14     def __init__(self,name,breed,aggr,life_value):15         self.nickname = name16         self.breed = breed17         self.aggr = aggr18         self.life_value = life_value19     def bite(self,person):20         person.life_value = person.life_value - self.aggr21 22 alex = Person('alex',250,500)23 egon = Person('egon',22,10)24 dahei = Dog('dahei','狼',30,2000)25 26 print(dahei.life_value)   #alex攻击dog,要打印狗的血27 alex.attack(dahei)28 print(dahei.life_value)29 30 print(alex.life_value)    #dog攻击alex,要打印alex的血31 dahei.bite(alex)32 print(alex.life_value)33 34 print(dahei.life_value)   #egon攻击dog,要打印狗的血35 egon.attack(dahei)36 print(dahei.life_value)

 

五,人狗大战,人民币版本

1 #!/usr/bin/env python 2 #_*_coding;utf-8_*_ 3  4 #人狗大战,人民币版本 5 class Person: 6     ''' 7     这是一个游戏里人物的数据类型 8     ''' 9     role = '中国人'    #类属性—— 静态属性10     def __init__(self,name,life_value,aggr):11         self.name = name #名字    #对象属性12         self.life_value = life_value #生命值 对象属性13         self.aggr = aggr #攻击力 对象属性14     def attack(self,enemy):  #攻击方法——动态属性15         enemy.life_value = enemy.life_value - self.aggr16 17 class Dog:18     def __init__(self,name,breed,aggr,life_value):19         self.nickname = name #昵称20         self.breed = breed   #品种21         self.aggr = aggr     #攻击力22         self.life_value = life_value  #生命值23     def bite(self,person):  #咬24         person.life_value = person.life_value - self.aggr25 egon = Person('egon',1000,50)26 dahei = Dog('dahei','狼',30,20000)27 egon.money = 200    #加入新的属性,也可以重写对象属性,这里因为是实例化后加入28 print(egon.money)29 30 class Weapon:  #武器类31     def __init__(self,name,aggr,life_value,price,attack_force):32         self.price = price33         self.name = name34         self.aggr = aggr   #伤害加成35         self.life_value = life_value #生命加成36         self.attack_force = attack_force #攻击力37     def update(self,person):  #带装备,人38         person.money = person.money - self.price39         person.aggr = person.aggr + self.aggr40         person.life_value = person.life_value + self.life_value41     def kill(self,obj):  #装备:主动技能42         obj.life_value = obj.life_value - self.attack_force43 r = Weapon('sword_soul',50,250,199,10000)44 45 if egon.money > r.price:46     r.update(egon)     #给egon装备上武器,相当于方法,然后有些对象属性增加,但是不会拥有所有属性47     egon.weapon = r    #所有的属性方法你都可以调用了48 49 # print(dahei.life_value)50 # print(egon.aggr)51 # egon.attack(dahei)52 # print(dahei.life_value)53 54 # egon.weapon.kill(dahei)   #调用武器的技能55 # print(dahei.life_value)56 # egon.weapon.kill(dahei)57 # print(dahei.life_value)

 

六,命名空间问题

1 #!/usr/bin/env python 2 #_*_coding;utf-8_*_ 3  4 # 命名空间 5 # 属性(类属性,静态属性),引用都是一样的,id一样 6 print(id(egon.role))     #可以共享 7 print(id(alex.role)) 8 print(id(Person.role)) 9 10 # 方法(动态属性)11 print(egon.name)12 print(alex.name)13 print(egon.attack)14 print(alex.attack)15 print(Person.attack)16 17 # 对象改变属性(静态属性,类属性)  对象修改属性是把属性拿下来之后改的,只对自己的米命名空间起作用18 egon.role = '印度人'19 print(egon.role,id(egon.role))20 print(alex.role,id(alex.role))21 print(Person.role,id(Person.role))22 # 如果属性改变,那就是都改变了23 Person.role = '印度人'24 print(alex.role)25 print(egon.role)

 

七,总结

1 #!/usr/bin/env python 2 #_*_coding;utf-8_*_ 3  4 class 类名: 5     类属性 = None 6     def __init__(self,对象属性): 7         self.对象属性 = 对象属性 8     def 方法名(self): 9         pass10 实例 = 类名(10)11 实例.方法名()12 # #类名13 # 类名.类属性14 # 类名.方法名15 16 # 实例 = 类名(参数,参数)  #实例就是对象17 18 # #实例19 # 实例.方法名()20 # 实例.对象属性21 22 # #实例增加属性23 # 实例.新的属性名 = 100024 # print(实例.新的属性名)25 26 #dir(类) #返回类中的所有名字列表27 #isinstance(对象,类) #判断对象是否为类的实例28 # print(Person.__doc__)  打印类的注释消息29 # print(Person.__dict__) # 返回一个字典 key是属性名,value是属性值30 # print(Person.__module__)  #person类所在的模块31 # print(Person.__name__,type(Person.__name__)) #字符串数据类型的类名32 # from collections import namedtuple33 # p = namedtuple('Point',['x','y'])34 # p1 = p(1,2)35 # print(p.__name__)

 

转载于:https://www.cnblogs.com/jokerbj/p/7350498.html

你可能感兴趣的文章
MySQL创建用户,并设置指定访问数据库
查看>>
连接AdapterView视图和数据源的桥梁:Adapter适配器(3)
查看>>
linux所有命令失效的解决办法
查看>>
undefined reference to 问题汇总及解决方法 ----- 还有一种问题没有解决(可能是顺序问题)...
查看>>
logout命令详解
查看>>
解决input的回车enter和失焦blur冲突问题:实现回车保存,blur还原编辑内容功能...
查看>>
linux内核编程学习笔记一:AT&T汇编语言(转)
查看>>
windows等级安排
查看>>
RaspberryPi cProfile使用
查看>>
安装skype for business server组件 报错“未满足先决条件”和安装KB2982006补丁提示“此更新不适用于你的计算机”...
查看>>
Linux常用命令
查看>>
HDU 1421 搬寝室
查看>>
软件界面设计工具 UI
查看>>
力扣算法题—085最大矩阵
查看>>
mysql多实例
查看>>
北京智控美信(长春)数据中心应聘总结
查看>>
C指针分析详解
查看>>
svs 在创建的时候 上传文件夹 bin obj 这些不要提交
查看>>
深度优先搜索-----部分和问题
查看>>
javascript 数组方法总结
查看>>