zoukankan      html  css  js  c++  java
  • 类的讲义

    类和对象傻傻分不清?找不到“对象”迷迷糊糊?

    • 本讲义适用于初学者,对类理解不了的,主要使用白话的方式讲解类,高手自行略过
    • 本文主要用三个例子说明什么是类,和类的继承特性,理论知识请参考视频,本文不做过多说明
    • 发挥想象力,发挥想象力,发挥想象力(重要的事说三遍)

    什么是类?

    • 类是一个抽象的概念,需要大伙发挥抽象思维,在世间万物中,你把一个事物抽象出来,这就是类;你把这个事物具体化描述,这就是对象
    • 对象是类的实例化(具体描述)表现

    现在,我们充分发挥想象力 整一个类先!

    • 例(我们打开LOL,虽然我很久没玩了):
    class Role(object):
        '''这是一个角色'''
        def __init__(self,name,物防,魔防,攻击):
            self.名称 = ''
            self.基础物防 = ''
            self.基础魔防 = ''
            self.基础攻击 = ''
    
    # ok,我们定义了一些简单的属性,类的一些数据,我们通常叫做属性
        def hit(self,type,目标对象):
            '''这是一个普通攻击'''
            damage = 0
            if type == '物理':
                # 有的英雄是物理普攻
                damage = self.基础攻击 - 目标对象.物防
            elif type == '法术':
                # 有的是魔法攻击
                damage = self.基础攻击 - 目标对象.法防
            else:
                # 有的是混合攻击
                 damage = (self.基础物攻*40% - 目标对象.法防) + (self.基础魔攻*60% - 目标对象.法防)
            return danmage
    
        def walk(self,speed):
            # 这个角色不能走怎么行?
            print(f'点一下走{speed}米')
    
    # 好了,上述代码在LOL启动时候被执行,现在,3组的延凯选择了盖伦
    # 嘿嘿,LOL马上找到盖伦的类,继承这个角色
    
    class 盖伦(Role):
        # 英雄都是系统的角色
        # 赶快继承Role
        def __init__(self,name,物防,魔防,攻击):
            super(盖伦,self).__init__(name,物防,魔防,攻击) #新式继承写法
            self.物理攻击 = self.基础攻击 + 皮肤加成 +各种加成
    
    
        def 致命打击(self):
            key = 'Q'
            level = 1 #技能等级
            damage = 30 +1.4*self.物理攻击
            return damage
    # 先这样,大招你自己想去
    # LOL载入这个盖伦
    延凯 = 盖伦(基础属性) # 盖伦被实例化(对象)给延凯了!
    # 嗯,一个人怎么玩呢,现在小班选择了寒冰射手
    小班 = 寒冰射手(基础属性)
    # 开始游戏
    
    。。。。
    
    #一堆代码在监测鼠标和键盘
    if 延凯的鼠标点击空地:
        延凯.walk(speed=350)
    if 延凯的鼠标点击小班:
        延凯.walk()
        延凯.walk()
        ....
        当延凯距离小班<100米:
            damage = 延凯.hit(type="物理",目标对象=小班)
            print("啊!延凯敲{目标对象.name}造成{damage}伤害")
    
    #  上面是为了你们理解类写的伪代码

    老师,我不打游戏,理解不了~

    • 那好,为了你们的幸福,我再整一个类
    • 我不知道上面这个是谁
    class People(object):
        '''我们都是人类!是人类'''
        def __init__(self,name,age,height)
            self.name = name
            self.age = age
            self.height = height
    
        def speak(self,word):
            print(f'{self.name}说:{word}')
    
    class Girl(People):
        '''男人、女人、女博士,都是人,赶快继承'''
        def __init__(self,name,age,height,三围): # 女人嘛,要三围
            super(Girl,self).__init__(name,age,height)
            self.三围 = 三围  # 我不知道怎么写这个三围,将就看吧
    
        def 撒娇(self,目标对象):
            print(f'{self.name}在对{目标对象}撒娇')
    
        def 买买买(sefl):
            print('清空购物车')
    
    # 这里还有一个Boy类,自己去想吧
    • 程序员都苦逼,这天,我们3组的小贺找到一个女朋友
    # 找到对象了,还不赶快实例化,不然女朋友跑了
    小苍 = Girl('小苍',25,170,小苍的三围)
    小贺 = Boy('小贺',28,180) # 男人要什么三围
    # 有一天,小贺让小苍生气了,不得了,小苍直接....
    小苍.买买买()  # 调用方法,清空购物车,小贺得吃泡面了~
    # 小苍买买买后,心情舒畅了,撩小贺中
    小苍.撒娇(小贺)
    
    # 好了,以上涉及人名如有侵权,请联系小班老师
    • 数据(名词)=》属性 ,动作(动词)=》方法,类实例化=》对象
    • 骚年们,你们找到对象了吗?

    老师,我们都是技术宅,不懂游戏,不懂对象,理解不了

    • 嗯,小编我再三思索,唯有此招

    创建一个类微信公众号操作类

    • 以下均为伪代码,不能实际部署
    import configparser
    class WeChat(object):
        '''这是一个操作微信公众号的类'''
        def __init__(self):
            self.get_config()
            self.token = self.get_token # token在调用很多API都要有,这里存储起来
            # token在实际中还有时效性,需要判断是否再次获取
    
        def get_config(self):
            config = configparser.ConfigParser()
            config.read('config.ini')
            self.app_id = config['DEFAULT']['APPID'])
            self. secret = config['DEFAULT']['Secret'])
    
        def get_token(self):
            url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential'
            # 还记得爬虫章节吗?自己用request的get去拿token去~
            return token
    
    
        def send_all(self,content):
            # 群发消息
            url = 'https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=%s'%(self.token)
            # 自己去拼接URL
            value = {
                "filter":{
                    "is_to_all":False, # True表示群发,False不群发
                    "tag_id":0 # 如群发,这里可以不写,否则,这个标识群发的组ID
                },
                "text":{
                    "content":content # 群发内容
                },
                "msgtype":"text" # 群发类型:文本
            }
            # 使用request的post方法,发送消息
    
    #  一个简单的微信操作类就写完了
    wc = WeChat()
    content = '群发消息测试'
    wc.send_all(content)
    

    与一个大型操作相关的,可以封装为一个类,方便类内部调用数据,方便类外部调用方法。

    小结

    • 以上三个小栗子是否有助于你理解类呢?
    • 类,需要大家进行抽象;python世界,一切皆对象

    我使用函数很简单,为什么要写类?

    • 这个问题,回到了前辈们的争论:函数式编程好,还是面向对象好?
    • 这个没有统一的答案,只能说,类的特性使它在编程中用的越来越广泛
      • 安全性封装,类的外部仅通过类的接口访问,对于私有变量和方法有很好的保护
      • 现阶段因为代码简单,其实改写类会耗费更多的时间,当程序复杂的时候,使用类的继承特性、封装特性,可以有效降低代码量

    类的一些拓展

    类的私有属性

    self.__attrname用两个下划线开头定义为私有属性,只在类的内部可以访问

    只读访问私有属性

    • 在类中定义一个方法返回此属性,对外部提供只读访问接口
    def get_attrname(self)
        return self.__attrname
    • 强制访问(不要这么做)
      实例后跟‘.’,接一个下划线,接类名,接两个下划线的私有属性
    var1 = class_name()
    var1._class_name__attrname

    类的特殊方法

    静态方法

    • 字段

      • 普通字段/普通属性(保存在实例化的对象中)
      • 静态字段/静态方法(保存在类中)
    • 方法

      • 普通方法(保存在类中,实例化的对象进行调用,至少有一个self参数)
      • 静态方法(保存在类中,调用者-》类(无需创建对象),可以有任意参数):
    class F1:
        @staticmethod
        def a1(self):#静态方法self参数不是必须
            print("F1A1")
    
    F1.a1()直接调用,不必实例化。多用于一些功能、工具封装的类

    类方法 @classmethod

    • 不是很常用,请参照视频7-4
  • 相关阅读:
    吊打面试官系列:Redis 性能优化的 13 条军规大全
    Laravel 7.6 发布
    Laravel 8 新功能:使用 schema:dump 来加速 Migration 和测试
    php中常用的4种运行方式
    基于 Redis 的订阅与发布
    [ida]使用pycharm编写IDApython
    visual studio 配置使生成的pdb文件中包含所有符号
    D/B位、一致与非一致代码段、向下拓展的实验与总结
    [debug] CE指针扫描扫出来为空
    error LNK2019: 无法解析的外部符号 _main,该符号在函数___tmainCRTStartup 中被引用
  • 原文地址:https://www.cnblogs.com/limich/p/9565097.html
Copyright © 2011-2022 走看看