python面向对象(二)
发布日期:2021-10-26 23:04:11 浏览次数:13 分类:技术文章

本文共 3245 字,大约阅读时间需要 10 分钟。

属性查找 类有两种属性:数据属性和函数属性

  1. 类的数据属性是所有对象共享的

  2. 类的函数属性是绑定给对象用的

class BeijingStudent:   school='Beijing'   def learn(self):       print('is learning')          def eat(self):       print('is eating')      def sleep(self):       print('is sleeping')s1=BeiJingStudent()s2=BeiJingStudent()s3=BeiJingStudent()#类的数据属性是所有对象共享的,id都一样print(id(BeijingStudent.school))print(id(s1.school))print(id(s2.school))print(id(s3.school))'''43773473284377347328'''#类的函数属性是绑定给对象使用的,obj.method称为绑定方法,内存地址都不一样#ps:id是python的实现机制,并不能真实反映内存地址,如果有内存地址,还是以内存地址为准print(BeijngStudent.learn)print(s1.learn)print(s2.learn)print(s3.learn)'''
>
>
>'''复制代码

在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常

绑定到对象的方法的特殊之处

#改写class BeijingStudent:   school='Beijing'   def __init__(self,name,age,sex):       self.name=name       self.age=age       self.sex=sex   def learn(self):       print('%s is learning' %self.name) #新增self.name   def eat(self):       print('%s is eating' %self.name)   def sleep(self):       print('%s is sleeping' %self.name)s1=BeijingStudent('李坦克','男',18)s2=BeijingStudent('王大炮','女',38)s3=BeijingStudent('牛榴弹','男',78)复制代码

类中定义的函数(没有被任何装饰器装饰的)是类的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数

BeijingStudent.learn(s1) #李坦克 is learningBeijingStudent.learn(s2) #王大炮 is learningBeijingStudent.learn(s3) #牛榴弹 is learning复制代码

类中定义的函数(没有被任何装饰器装饰的),其实主要是给对象使用的,而且是绑定到对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法

强调:绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,谁来调用,就会将‘谁’本身当做第一个参数传给方法,即自动传值(方法__init__也是一样的道理)

s1.learn() #等同于BeijingStudent.learn(s1)s2.learn() #等同于BeijingStudent.learn(s2)s3.learn() #等同于BeijingStudent.learn(s3)复制代码

注意:绑定到对象的方法的这种自动传值的特征,决定了在类中定义的函数都要默认写一个参数self,self可以是任意名字,但是约定俗成地写出self。

类即类型

  提示:python的class术语与c++有一定区别,与 Modula-3更像。

  python中一切皆为对象,且python3中类与类型是一个概念,类型就是类

#类型dict就是类dictlist
#实例化的到3个对象l1,l2,l3l1=list()l2=list()l3=list()#三个对象都有绑定方法append,是相同的功能,但内存地址不同l1.append
l2.append
l3.append
#操作绑定方法l1.append(3),就是在往l1添加3,绝对不会将3添加到l2或l3l1.append(3)l1[3]l2[]>>> l3[]#调用类list.append(l3,111)等同于l3.append(111)list.append(l3,111) #l3.append(111)l3[111]复制代码

对象之间的交互

class Garen:        #定义英雄盖伦的类,不同的玩家可以用它实例出自己英雄;   camp='Demacia'  #所有玩家的英雄(盖伦)的阵营都是Demacia;   def __init__(self,nickname,aggressivity=58,life_value=455): #英雄的初始攻击力58...;       self.nickname=nickname  #为自己的盖伦起个别名;       self.aggressivity=aggressivity #英雄都有自己的攻击力;       self.life_value=life_value #英雄都有自己的生命值;   def attack(self,enemy):   #普通攻击技能,enemy是敌人;       enemy.life_value-=self.aggressivity #根据自己的攻击力,攻击敌人就减掉敌人的生命值。复制代码

我们可以仿照garen类再创建一个Riven类

class Riven:   camp='Noxus'  #所有玩家的英雄(锐雯)的阵营都是Noxus;   def __init__(self,nickname,aggressivity=54,life_value=414): #英雄的初始攻击力54;       self.nickname=nickname  #为自己的锐雯起个别名;       self.aggressivity=aggressivity #英雄都有自己的攻击力;       self.life_value=life_value #英雄都有自己的生命值;   def attack(self,enemy):   #普通攻击技能,enemy是敌人;       enemy.life_value-=self.aggressivity #根据自己的攻击力,攻击敌人就减掉敌人的生命值。复制代码

实例出俩英雄

g1=Garen('草丛伦')r1=Riven('锐雯雯')复制代码

交互:锐雯雯攻击草丛伦,反之一样

g1.life_value455r1.attack(g1)g1.life_value401复制代码

补充:

garen_hero.Q()称为向garen_hero这个对象发送了一条消息,让他去执行Q这个功能,类似的有:   

garen_hero.W()garen_hero.E()garen_hero.R()复制代码

识别图中二维码,欢迎关注python宝典

转载地址:https://blog.csdn.net/weixin_34138377/article/details/87964869 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:滴滴客服系统,是“打车夺命”事件的帮凶!
下一篇:从零构建vue2 + vue-router + vuex 开发环境到入门,实现基本的登录退出功能(二)...

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月05日 20时32分50秒