类和对象傻傻分不清?找不到“对象”迷迷糊糊?
- 本讲义适用于初学者,对类理解不了的,主要使用白话的方式讲解类,高手自行略过
- 本文主要用三个例子说明什么是类,和类的继承特性,理论知识请参考视频,本文不做过多说明
- 发挥想象力,发挥想象力,发挥想象力(重要的事说三遍)
什么是类?
- 类是一个抽象的概念,需要大伙发挥抽象思维,在世间万物中,你把一个事物抽象出来,这就是类;你把这个事物具体化描述,这就是对象
- 对象是类的实例化(具体描述)表现
现在,我们充分发挥想象力 整一个类先!
- 例(我们打开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