python学习笔记 day22 面向对象(一)

python学习笔记 day22 面向对象(一)1.人狗大战一个简单的小例子,定义一个Person(类)里面有人的很多属性,比如名字,性别,血量。攻击力,然后定义一个Dog(类),里面设置狗的很多属性,名字,血量,攻击力,种类等,然后又定义了两

大家好,又见面了,我是你们的朋友全栈君。

 1. 人狗大战

一个简单的小例子,定义一个Person(类)里面有人的很多属性,比如名字,性别,血量。攻击力,然后定义一个Dog(类),里面设置狗的很多属性,名字,血量,攻击力,种类等,然后又定义了两个函数attack 人打狗,以及bite()狗打人的函数,然后就可以操作这些函数,让人狗大战啦:

def Person(name,aggr,blood,sex):
    person={
        'name':name,
        'aggr':aggr,
        'blood':blood,
        'sex':sex
    }
    return person

def attack(person,dog):
    dog['blood']-=person['aggr']
    print("%s 被打了,掉了%s 的血"%(dog['name'],person['aggr']))

def Dog(name,aggr,blood,kind):
    dog={
        'name':name,
        'aggr':aggr,
        'blood':blood,
        'kind':kind
    }
    return dog

def bite(dog,person):
    person['blood']-=dog['aggr']
    print("%s 被咬了,掉了%s 的血"%(person['name'],dog['aggr']))
xuanxuan=Person('alex',2,100,'')
lucky=Dog('lucky',2,200,'泰迪')

attack(xuanxuan,lucky)
bite(lucky,xuanxuan)

 

运行结果:
<span role="heading" aria-level="2">python学习笔记 day22 面向对象(一)

 

但是有一点问题就是attack()也可以传参数,让狗“打”人(虽然我们知道这样是不合理的,所以才是有问题):

比如 bite(xuanxuan,lucky)的意义就变成了,xuanxuan咬lucky 这显然是不合理的~

所以可以考虑把bite()这个跟狗有关的 放在Dog()函数里面,限制只能由lucky这个已经实例化Dog()类的狗来调用,接下来给bite()函数传一个对象就可以啦~

def Person(name,aggr,blood,sex):
    person={
        'name':name,
        'aggr':aggr,
        'blood':blood,
        'sex':sex
    }
    def attack(dog):  # 这就形成了一个闭包,就是在内部函数中使用了外部函数内的变量名
        dog['blood'] -= person['aggr']
        print("%s 被打了,掉了%s 的血" % (dog['name'], person['aggr']))
    person['attack']=attack
    return person



def Dog(name,aggr,blood,kind):
    dog={
        'name':name,
        'aggr':aggr,
        'blood':blood,
        'kind':kind
    }
    def bite(person):
        person['blood'] -= dog['aggr']
        print("%s 被咬了,掉了%s 的血" % (person['name'], dog['aggr']))
    dog['bite']=bite
    return dog


xuanxuan=Person('alex',2,100,'')
lucky=Dog('lucky',2,200,'泰迪')

xuanxuan['atack'](lucky)  # 首先xuanxuan是一个字典 然后里面有个key 是attack 对应的value值是attack()函数,限制在函数Person()函数内部,就可以不乱颠倒人狗打架操作
lucky['bite'](xuanxuan)   # lucky是一个上面定义的字典,然后有个key 是bite。对应的是函数bite()函数,外不知可以传一个person 限制狗咬人

 

运行结果:
<span role="heading" aria-level="2">python学习笔记 day22 面向对象(一)

 

lucky是调用的Dog()传进了一些参数,定义它为一条狗,然后由于Dog()函数在内部定义了一个函数(闭包)bite()函数(有个参数)让外部不能直接调用bite函数,只能通过县定义一个狗,然后通过这个狗[‘bite’]来调用bite()函数,这样我们bite()函数中穿的就是一个人,或另外一条狗,都是很合理的,就不会出现原来的bite()传两个参数,bite(xuanxuan,lucky)变成xuanxuan咬lucky了~

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156144.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux配置redis开机启动(CentOS 7)

    Linux配置redis开机启动(CentOS 7)

    2021年10月27日
    51
  • openfiledialog控件_ASP 第三方控件

    openfiledialog控件_ASP 第三方控件Logdashboard1.1beta.在AspNetMvc中使用日志面板Logdashboard是Net下的日志面板,它支持AspNet与AspNetCore项目。关于更多LogDashboard的介绍请看这里。就在刚刚LogDashboard发布了1.1的beta版,在这个版本中有以下变化https://github.com/liangshiw/LogDashboard/releas…

    2022年9月28日
    0
  • QListWidget的QSS用法「建议收藏」

    QListWidget的QSS用法「建议收藏」本文完全是转载如下网址博客内容,如有侵权,请及时通知,博主会删除。原文地址:https://blog.csdn.net/u011125673/article/details/51753997QListWidget和QTableWidget的使用和属性,QTableWidget和QListWidget样式表的设置,滚动条的样式设置一、QListWidget的使用//一、QListWidgetli…

    2022年6月5日
    312
  • Spring Boot 中使用@KafkaListener并发批量接收消息[通俗易懂]

    Spring Boot 中使用@KafkaListener并发批量接收消息[通俗易懂]kakfa是我们在项目开发中经常使用的消息中间件。由于它的写性能非常高,因此,经常会碰到Kafka消息队列拥堵的情况。碰到这种情况时,有不能直接清理整改消息队列,因为还有别的服务正在使用该队列。因此只能额外启动一个相同名称的consumer-group来加快消息消费(经测试,如果该topic只有一个分区,实际上再启动一个新的消费者作用不到)。具体代码在这里,欢迎加星号,fork。官方文档……

    2022年10月15日
    0
  • 微信公众号网页开发,获取 调用微信公众号接口后 的返回值,PHP

    微信公众号网页开发,获取 调用微信公众号接口后 的返回值,PHP在微信公众号网页开发中,我们通常会用到许多微信团队提供的接口,我们在运行单个php调用接口的时候,返回值直接出现在php的echo中,我们根据这个值来判断代码正确与否,但是当php文件和微信公众号连接起来的时候,我们无法获取返回值,下面就展示一下如何将返回值的信息写入txt文件中。测试代码段&lt;?php$myfile=fopen("fanhui.txt","a+")ordie("U…

    2022年6月5日
    121
  • CreatePipe/CreateProcess[通俗易懂]

    CreatePipe/CreateProcess[通俗易懂]管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机。一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来。匿名管道(AnonymousPipes)是在父进程和子进程间单向传输数据的一种未命名的管道,只能在本地计算机中使用,而不可用于网络间的通信。      匿名管道实施细则      匿名管道由Cre

    2022年7月26日
    16

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号