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

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

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

编程思想

  1. 面向过程:根据业务逻辑从上到下写代码
  2. 函数式:封装到函数中便于以后调用,对比面向过程减少了代码量
  3. 面向对象(oop):采用对象的概念建立模型

类和类的对象

概念

  1. 类:是具有一组相同特征【属性】和行为【方法】的对象集合
  2. 对象:是实实在在的东西,也是类的实例化,具体化

关系

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

类的抽象

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

  • 小明 -> 人【类】
    • 类名:人
    • 属性:年龄、身高等
    • 方法:吃饭、睡觉等
  • 宝马车 -> 车【类】
    • 类名:车
    • 属性:颜色、排量等
    • 方法:前进、倒车、加速等

案例2:坦克大战中的类

  • 坦克【类】
    • 类名:坦克
    • 属性:血量
    • 方法:发射子弹、移动等
  • 墙【类】
    • 类名:墙
    • 属性:血量、类型
    • 行为:阻挡
  • 子弹【类】
    • 类名:子弹
    • 属性:威力
    • 行为:移动

定义类、创建对象

定义类

  1. 格式

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

    class Person: # 类名
        name = '小张' # 属性
        age = 18
        pos = '山东省'
    
        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中且有默认的参数self
            print('在吃饭呢!')
    
  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 = 19
      
          def eat(self):
              print('在吃饭呢!')
      
    • 总结:

      • 可以在创建对象后使用【类名.实例属性名】
      • 也可以在 _init_ 方法中使用【self.实例变量名】来定义实例属性
  2. 初始化数据

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

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

    运行结果:

  3. 传参机制

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

    class Person:
        name = '小李'  # 类属性
        age = 20
        pos = '河南省'
    
        def __init__(self, name, age, pos):  # 传参数
            self.name = name
            self.age = age
            self.pos = pos
    
    
    perB = 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

运行结果:


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

创作不易,感谢支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值