python开发面向对象基础:人狗大战学面向对象

2023-11-14

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

 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_value
10     }
11     return p_dic
12 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_value
20     }
21     return d_dic
22 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':attack
12     }
13     return p_dic
14 
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':bite
23     }
24     return d_dic
25 
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就是joker
14 # 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'] = aggr
10         return self
11     self_ret =  __init__(*args,**kwargs)
12     return self_ret
13 # 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 = aggr
10     def attack(self,enemy):  #方法——动态属性,enemy对象,攻击谁
11         enemy.life_value = enemy.life_value - self.aggr
12 # 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血会减少,相当于改了实例里面的value
17 # 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 = aggr
10     def attack(self,dog):  #方法——动态属性,enemy对象,攻击谁
11         dog.life_value = dog.life_value - self.aggr
12 
13 class Dog:
14     def __init__(self,name,breed,aggr,life_value):
15         self.nickname = name
16         self.breed = breed
17         self.aggr = aggr
18         self.life_value = life_value
19     def bite(self,person):
20         person.life_value = person.life_value - self.aggr
21 
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.aggr
16 
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.aggr
25 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 = price
33         self.name = name
34         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.price
39         person.aggr = person.aggr + self.aggr
40         person.life_value = person.life_value + self.life_value
41     def kill(self,obj):  #装备:主动技能
42         obj.life_value = obj.life_value - self.attack_force
43 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         pass
10 实例 = 类名(10)
11 实例.方法名()
12 # #类名
13 # 类名.类属性
14 # 类名.方法名
15 
16 # 实例 = 类名(参数,参数)  #实例就是对象
17 
18 # #实例
19 # 实例.方法名()
20 # 实例.对象属性
21 
22 # #实例增加属性
23 # 实例.新的属性名 = 1000
24 # 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 namedtuple
33 # p = namedtuple('Point',['x','y'])
34 # p1 = p(1,2)
35 # print(p.__name__)

 

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python开发面向对象基础:人狗大战学面向对象 的相关文章

随机推荐

  • 【Python数据分析 - 2】:多个坐标系的绘制

    文章目录 多个坐标系绘制的代码 绘图结果 多个坐标系绘制的代码 本文无过多讲解 大部分为代码 提供了解 import matplotlib pyplot as plt import random 设置字体 plt rcParams font
  • 关于Comparator接口和Comparable接口的对比(实例展示)

    我们首先来看看API上是如何解释的 Comparable接口 该接口对实现它的每个类的对象强加一个整体排序 这个排序被称为类的自然排序 类的compareTo方法被称为其自然比较方法 Collections sort 和Arrays sor
  • 用浏览器打不开eureka,且其他服务连接eureka异常

    原因 没有在eureka服务的启动类上添加 EnableEurekaServer注解
  • 回答一位同学的来信

    由于个人隐私的原因 将这位同学的名字匿掉了 因为事先并未征求该同学的意见就将这封信贴了上来 如果该同学认为我侵犯了你的隐私请及时告知我 我会将这篇文章撤掉 之所以发表这篇文章是因为个人觉得它很有代表性 很有可能别的同学也正在为此事困扰着 希
  • 拦截一切的CoordinatorLayout Behavior

    原文地址 http jcodecraeer com a anzhuokaifa androidkaifa 2016 0224 3991 html 如果没有深入CoordinatorLayout 你注定无法在探索Android Design
  • Kibana环境安装及常用命令

    已成功起飞 将自己进大厂前花4w买的java全套教程 整整300集 现在拿出来分享给大家 拿走不谢 从入门到精通 学会即可就业 哔哩哔哩 bilibili 1 安装包解压 tar zxvf kibana 6 4 3 linux x86 64
  • 服务器虚拟cd,如何在VMware虚拟机上安装CD或DVD数据?

    如何在VMware ESX或ESXi里使用CD安装诸如Windows XP Windows Server或Linux这样的操作系统 知道这些是在新子虚拟机上获取操作系统及其应用的关键 对于我们这些使用了好些年服务器和桌面虚拟化的人来说 这些
  • [Python人工智能] 三十六.基于Transformer的商品评论情感分析 (2)keras构建多头自注意力(Transformer)模型

    从本专栏开始 作者正式研究Python深度学习 神经网络及人工智能相关知识 前一篇文章利用Keras构建深度学习模型并实现了情感分析 这篇文章将介绍Transformer基础知识 并通过Keras构建多头自注意力 Transformer 模
  • Qt之右键菜单实现

    最近在看C GUI Qt4部分其中有个例子对于扩展一个应用程序提供一个上下文菜单 Qt中的部件的弹出菜单 ContextMenu 依据ContextMenuPolicy的值的不同 有四种形式 一 默认菜单 此时 ContextMenuPol
  • Python 10(Socket网络编程 )

    本节内容 Socket介绍 参数介绍 基本实例 Socket实现多连接处理 通过Socket实现简单SSH 通过Socket实现文件传送 Socket网络编程 此部分内容涉及到 计算机网络相关知识 OSI七层网络模型 大概的流程如下 通信实
  • 合肥工业大学编译原理实验一词法分析

    基本思路 词法分析是对输入语句串中一个个单词符号进行分析 最后格式化输出种别码 类型 位置等信息 那么 就可以考虑一次读入一个字符将它们拼接成一个字符串 当碰到空格或者分界符 时 就把前面已读的字符串格式化输出 再输出当前分界符 然后再往后
  • ThreadLocal详解-ThreadLocal这一篇就够了

    ThreadLocal简介 ThreadLocal 用于存储当前线程的变量 对其他线程是隔离 ThreadLocal为每个线程提供 get 或 set 方法来创建独立初始化的变量副本 ThreadLocal实例通常是类中希望将状态与线程相关
  • postgresql学习笔记之归档堆积处理(亲测有用)

    一 跟归档相关的参数 1 查看是否开启归档模式 show archive mode 仅在已完成的wal段进行归档 如果强制归档 归档段文件大小也是16M 2 查看归档相关参数 show archive timeout 超过这个时长就必须归档
  • 《信号与系统学习笔记》—拉普拉斯变换(二)

    注 本博客是基于奥本海姆 信号与系统 第二版编写 主要是为了自己学习的复习与加深 一 用拉普拉斯变换分析与表征线性时不变系统 1 在拉普拉斯变换的范畴内 一般称H s 为系统函数或转移函数 线性时不变系统的很多性质都与系统函数在s平面的特性
  • 基于STM32WIFI远程监控电压电流表(二)电流检测电路

    电流检测电路 电流检测的原理 电流检测电路 1 低侧检测 2 高侧检测 应用电路 电流检测的原理 电路检测电路常用于 高压短路保护 电机控制 DC DC换流器 系统功耗管理 二次电池的电流管理 蓄电池管理等电流检测等场景 对于大部分应用 都
  • Augment Reality(AR)现实增强的原理

    这篇博客将介绍OpenCV Augment Reality AR 增强现实的基础知识 增强现实技术指利用真实世界中的环境 然后通过计算机生成的程序来增强这些环境 从而不断丰富环境 通常 这是通过视觉 听觉和触觉 触觉交互的某种组合来实现的
  • lua调用shell 脚本

    Lua中 os execute可以执行dos命令 但是返回的是系统状态码 默认输出 io popen 也可以执行dos命令 但是返回一个文件 eg 复制代码 代码如下 local t io popen svn help local a t
  • vim编辑器显示与取消行号

    显示行号 set nu 取消显示行号 set nonu
  • 浅析 spring 事件驱动

    1 ApplicationContext publishEvent 同步还是异步 为什么 先说结论 默认情况下同步的 即事件发布者会阻塞等待事件处理完成 这是因为Spring的设计初衷是为了保证事件的有序处理和事务的一致性 看下代码实现 p
  • python开发面向对象基础:人狗大战学面向对象

    一 通过函数写人狗大战这个故事 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