热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AI学习Day07面向对象基础(上)

本文章最初发布在XJHui’sBlog,未经允许,任何人禁止转载!注意:最新修改版本已发布在这里,点击前往查看!编程思想面向过程:根据业务逻辑从上到下写代码函数式:封装到函数

本文章最初发布在 XJHui’s Blog,未经允许,任何人禁止转载!

注意:最新修改版本已发布在 这里,点击前往查看!


编程思想



  1. 面向过程:根据业务逻辑从上到下写代码

  2. 函数式:封装到函数中便于以后调用,对比面向过程减少了代码量

  3. 面向对象(oop):采用对象的概念建立模型


类和类的对象


概念



  1. 类:是具有一组相同特征【属性】和行为【方法】的对象集合

  2. 对象:是实实在在的东西,也是类的实例化,具体化


关系

类是对象的抽象化,对象是类的一个实例


类的抽象


案例1:小明开着宝马车去逛街




  • 小明 -> 人【类】

    • 类名:人

    • 属性:年龄、身高等

    • 方法:吃饭、睡觉等



  • 宝马车 -> 车【类】

    • 类名:车

    • 属性:颜色、排量等

    • 方法:前进、倒车、加速等




案例2:坦克大战中的类




  • 坦克【类】

    • 类名:坦克

    • 属性:血量

    • 方法:发射子弹、移动等



  • 墙【类】

    • 类名:墙

    • 属性:血量、类型

    • 行为:阻挡



  • 子弹【类】

    • 类名:子弹

    • 属性:威力

    • 行为:移动




定义类、创建对象


定义类



  1. 格式

    class 类名: # 注意:类名使用大驼峰命名法(首字母大写),可以不加括号,后面会详细写属性方法 #属性、方法的个数非定值,根据具体情况确定


  2. 案例:定义人【类】

    class Person: # 类名name = '小张' # 属性age = 18pos = '山东省'def eat(self): # 方法print('在吃饭呢!')def run(self):print('在跑步呢!')



创建对象



  1. 格式:

    对象名 = 类名()


  2. 案例:创建一个人【类】的对象

    perA = Person()


    • 使用(pycharm工具下):




    • 调用类方法:

      perA.eat() # 调用Person类中的eat方法

      运行结果:




    • 打印类属性:

      print("{}的年龄是:{},住在:{}".format(perA.name, perA.age, perA.pos)) # 输出类属性的值

      运行结果:







实例方法、属性


区别普通方法



  1. 普通方法:

    def Func(): # 普通方法print('这是普通方法!')


  2. 实例方法:

    class Person:name = '小张'def eat(self): # 实例方法,定义在class中且有默认的参数selfprint('在吃饭呢!')


  3. 总结:



    • 【相同点】均使用def关键字定义

    • 普通方法在class外部,实例方法在内部

    • 实例方法默认参数为self可更改但不可省略

    • 实例方法归属实例对象




区别类属性



  1. 类属性:

    class Person:name = '小张' # 类属性def eat(self):print('在吃饭呢!')


  2. 实例属性:

    class Person:name = '小张'def eat(self):self.color = 'yellow' # 实例属性,注意要用self引用print('皮肤颜色为{}'.format(self.color))


  3. 总结:



    • 都是定义在class内部

    • 定义在实例方法里面的是实例属性,定义在实例方法外面的是类属性

    • 定义实例属性时要用self引用(self.变量名,具体看2nd)




__init__方法


基本概念



  • python自带的内置函数具有特殊含义,使用双下划线包起来,又称【魔术方法】

  • 是初始化方法,用来【定义实例属性】和【初始化数据】,在创建的时候自动调用(类似java中构造方法)

  • 利用其【传参机制】可以使对象的创建更加简单、方便


init的使用



  1. 定义实例属性



    • 一般方法:

      perB = Person()
      perB.age = 19 # 添加实例属性


    • _init_:

      class Person:name = '小张' # 类属性def __init__(self): # 定义实例属性self.age = 19def eat(self):print('在吃饭呢!')


    • 总结:



      • 可以在创建对象后使用【类名.实例属性名】

      • 也可以在 _init_ 方法中使用【self.实例变量名】来定义实例属性





  2. 初始化数据


    可以用来初始化类属性的值


    class Person:name = '' # 类属性age = 0pos = ''def __init__(self): # 定义实例属性self.name = '小李'self.age = 20self.pos = '河南省'perB = Person()
    print(perB.age)

    运行结果:




  3. 传参机制


    通过传参实现在创建对象时给类属性赋值


    class Person:name = '小李' # 类属性age = 20pos = '河南省'def __init__(self, name, age, pos): # 传参数self.name = nameself.age = ageself.pos = posperB = Person('小张', 17, '北京市') # 创建对象时将数据作为参数传递
    print('{}的年龄是:{},住在:{}'.format(perB.name, perB.age, perB.pos))

    运行结果:





理解self


实例方法都有一个默认参数self,其名称可更改



相关概念



  • self和实例对象指向同一个内存地址

  • self只有在定义实例方法的时候才有意义


实例对象传参

class Person:name = '小李' # 类属性def showInfo(self, sex):print('{}的性别是:{}'.format(self.name, sex)) # 注意:使用self引导的是类属性,不加self的是实例方法的参数perB = Person()
perB.showInfo('男')

运行结果:



魔术方法


_str_


格式化输出对象信息




  1. 默认输出对象信息的格式:

    class Person:name = '小李' # 类属性def eat(self):print('在吃饭呀!')perB = Person()
    print(perB)

    运行结果:




  2. 使用__str__输出对象信息:

    class Person:name = '小李' # 类属性def __str__(self):return '我的名字叫:{}'.format(self.name) # 注意要通过return返回要打印的内容def eat(self):print('在吃饭呀!')perB = Person()
    print(perB)

    运行结果:





_new_


创建实例化对象


class Person:name = '' # 类属性def __init__(self):self.name = '小张'print('执行---init---')def __new__(cls, *args, **kwargs): # cls是class的缩写,但不需要人为传参print('执行---new---')return object.__new__(cls) # 一定要有返回值perB = Person()
print('我是名字是:{}'.format(perB.name))

运行结果:


注意:



  • new方法是创建实例对象必须要包含的,但若创建对象时不存在new方法,则会使用默认的new方法

  • 创建实例对象时new方法通过【return】将创建的实例对象返回给init方法,所以【new方法】执行时间是早于【init方法】的


new和init区别



  • new方法:类的实例化方法,使用时要【return】实例对象

  • init方法:定义实例属性、类属性的初始化

  • new方法执行时间早于init方法


双人对战游戏


问题描述



  1. 有两个人物:西门吹雪、叶孤城



  2. 属性:



    • 用户名:name



    • 血量:hp





  3. 方法:



    • tong():捅对方一刀,对方掉血10滴

    • kanren():砍对方- 刀,对方掉血15滴

    • chiyao():吃一颗药,补血10滴



  4. 要求:每走一步打印一次人物状态




问题分析



  1. 两个人物可以抽象出一个【玩家类】创建两个【实例对象】

  2. 属性、方法

  3. 通过随机数来确定走哪一步


游戏代码

代码在 这里,感谢 PasteMe!

运行结果:




不足之处,欢迎留言,会及时回复!

创作不易,感谢支持!


推荐阅读
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本人学习笔记,知识点均摘自于网络,用于学习和交流(如未注明出处,请提醒,将及时更正,谢谢)OS:我学习是为了上 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 【爬虫训练场】:分页爬虫案例设计Demo,Python Flask与MySQL的完美连接
    网站类应用,一定离不开MySQL,所以本案例将带着大家学习一下,通过Flask调用MySQL数据,并实现分页呈现。类被称作蓝图,它是一个存储操作方法的容器,Flask可以通过Blu ... [详细]
  • 本文介绍了使用Python根据字典中的值进行排序的方法,并给出了实验结果。通过将字典转化为记录项,可以按照字典中的值进行排序操作。实验结果显示,按照值进行排序后的记录项为[('b', 2), ('a', 3)]。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 零基础用Python打造Android字符串资源翻译器(五):增加图形化界面
    目录 ... [详细]
author-avatar
芨芨草_的美丽家园
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有