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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 降维算法:主成分分析 VS 自动编码器

    降维算法:主成分分析 VS 自动编码器降维是一种减少特征空间维度以获得稳定的、统计上可靠的机器学习模型的技术。降维主要有两种途径:特征选择和特征变换。特征选择通过选择重要程度最高的若干特征,移除共性的或者重要程度较低的特征。特征转换也称为特征提取,试图将高维数据投影到低维空间。一些特征转换技术有主成分分析(PCA)、矩阵分解、自动编码器(Autoencoders)、t-Sne、UMAP等。本文主要介绍了主成分分析以及自动编码器两种方法,具体分析两者的优缺点,并且通过一个生动的示例进行详解。主成分分析主成分分析是一种无监督技术,将原始数

    2022年5月27日
    36
  • BeanCopier常用方法 – cglib.beans常用工具类「建议收藏」

    BeanCopier常用方法 – cglib.beans常用工具类「建议收藏」BeanCopier是Cglib包中的一个类,用于对象的复制。①第一种两个bean间属性名和类型完全相同的变量进行拷贝Service层publicinterfaceSysUserService{/***新增用户数据*@paramsysUserBO*@return*/In…

    2025年8月27日
    8
  • SpringMVC: web.xml中声明DispatcherServlet时一定要加入load-on-startup标签[通俗易懂]

    SpringMVC: web.xml中声明DispatcherServlet时一定要加入load-on-startup标签

    2022年1月23日
    39
  • ASP.NET中水晶报表的使用

    ASP.NET中水晶报表的使用作者:caoli                             在我们对VS.Net中的水晶报表(CrystalReports)进行研究之前,我和我朋友对如何将这个复杂的东东加入我们的Web应用有着非常的好奇心。一周以后,在阅读了大量的“HOWTO”文档之后,我们成功地将一些简单的报告加入到了我们的Asp.net程序中,并得到了一些小决窍。  这篇文章教你如何在.NetWe…

    2022年5月20日
    41
  • 一致性Hash算法以及java实现「建议收藏」

    一致性Hash算法以及java实现「建议收藏」目前我们很多时候都是在做分布式系统,但是我们需把客户端的请求均匀的分布到N个服务器中,一般我们可以考虑通过Object的HashCodeHash%N,通过取余,将客户端的请求分布到不同的的服务端。但是在分布式集群中我们通常需要添加或删除服务器,所以通过取余是不行的。一致性Hash就是为了解决这个问题。  ConsistentHashing一致性Hash的原理  1、环型Hash空间…

    2022年10月5日
    2
  • 实例分割–Mask RCNN详解(ROI Align / Loss Fun)

    实例分割–Mask RCNN详解(ROI Align / Loss Fun)1总结架构与主要思想未完待续。。。

    2022年8月23日
    5

发表回复

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

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