类的讲义

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

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

什么是类?

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

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

  • 例(我们打开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
原文地址:https://www.cnblogs.com/limich/p/9565097.html