属性查找

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

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)'''<function BeijngStudent.learn at 0x1021329d8><bound method BeijngStudent.learn of <__main__.BeijngStudent object at 0x1021466d8>><bound method BeijngStudent.learn of <__main__.BeijngStudent object at 0x102146710>><bound method BeijngStudent.learn of <__main__.BeijngStudent object at 0x102146748>>'''

在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<class 'list'>

#实例化的到3个对象l1,l2,l3l1=list()l2=list()l3=list()

#三个对象都有绑定方法append,是相同的功能,但内存地址不同l1.append<built-in method append of list object at 0x10b482b48>l2.append<built-in method append of list object at 0x10b482b88>l3.append<built-in method append of list object at 0x10b482bc8>

#操作绑定方法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全套视频资料

python面向对象(二)的更多相关文章

  1. python面向对象(二)——类成员

    Python面向对象    类成员 1.字段         普通字段    属于对象         静态字段    属于类   2.方法 普通方法   触发者是对象    括号里至少一个参数 se ...

  2. python面向对象二

    1.1类的静态属性,类方法,类的静态方法 1.1.1静态属性(@property) 在类中: python内置的@property装饰器就是负责把一个方法(函数)变成属性来调用. class Stud ...

  3. python 面向对象二 类和实例

    一.类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法, ...

  4. Python 面向对象(二) 特殊方法

    一些Python特殊方法的汇总 __bases__    类的基类,返回元祖__base__  类的基类,也叫父类__call__ '类名()',类名加括号调用时执行的语句__class__ 对象或类 ...

  5. python 面向对象(二)--访问限制

    在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑. 但是,从前面Student类的定义来看,外部代码还是可以自由地修改一个实例的na ...

  6. python 面向对象(二)成员

    ##################################总结########################### 类的成员: 变量: 实例变量      对象.属性=xxx 类变量    ...

  7. Python 面向对象二(转载)

    来源:www.cnblogs.com/wupeiqi/p/4766801.html 三.类成员的修饰符 类的所有成员在上一步骤中已经做了详细的介绍,对于每一个类的成员而言都有两种形式: 1.公有成员, ...

  8. 四十一、python面向对象二

    A.成员: 1.字段:静态字段(每个对象都有同一字段),普通字典(每个对象都有不同的数据) 2.方法:静态方法(无需使用对象的内容),类方法,普通方法(使用对象中的数据) 3.特性:普通特性(将方法伪 ...

  9. Python自动化开发 - 面向对象(二)

    本节内容 1.isinstance(obj,cls)和issubclass(sub,super) 2.反射 3.__setattr__,__delattr__,__getattr__ 一. isins ...

随机推荐

  1. Mac和Windows上Android Studio经常使用的快捷键

    小编整理了一些Mac和Windows上超有用的Android Studio经常使用的快捷键. Ctrl(Command)+Y 删除行 Ctrl(Command)+Z 倒退 Ctrl(Command)+ ...

  2. win10 环境下 MinGW-w64安装

    MinGW-w64 就是 著名C/C++编译器GCC的Windows版本. 一.什么是 MinGW-w64 ?MinGW 的全称是:Minimalist GNU on Windows .它实际上是将经 ...

  3. 提升效率的JQUERY(转)

    摘要 本文部分整理了JQuery性能提升的一些方法,内容综合自artzstudio,viralpatel,htmlgoodies等网站,希望对大家有所帮助.这些规则虽然简单,但如果不遵循就会影响程序执 ...

  4. 过滤NSString中的Emoji

    有时候由于项目需求.要过滤NSString中的emoji. 比方下面情况: 要跟android互通,android假设还没做这方面的支持. 内容做为手机短信发出去. 思路例如以下,遍历NSString ...

  5. 2. Add Two Numbers【medium】

    2. Add Two Numbers[medium] You are given two non-empty linked lists representing two non-negative in ...

  6. OpenAPI初体验

    问题的一开始源于客户和服务部门抱怨我的REST API文档写得不好,然后又了解到 django rest framework 利用 coreapi 能自动生成文档,再就是看到 swagger.io 上 ...

  7. ToString(string format)输出格式简述

    ToString说明 ToString 是 .NET Framework 中主要的格式化方法.它将对象转换为其字符串表现形式,使它适合于显示.(有关对 .NET Framework 中的格式设置支持的 ...

  8. FreeMarker调用Java静态方法以及静态变量的方法

    这里介绍下在类似 Spring+FreeMarker 的架构中如何在FreeMarker中访问Java中的静态方法以及静态变量. 一.首先为了方便以及可复用我们创建一个工具类 /** * FreeMa ...

  9. I.MX6 Ethernet MAC (ENET) MAC Address hacking

    /********************************************************************* * I.MX6 Ethernet MAC (ENET) M ...

  10. 数据库 : Mysql - 日常应用

    #登录MYSQL数据库 MYSQL -u root -p #显示所有数据库 SHOW databases; #显示当前数据库与应用程序间进行了多少条连接 SHOW processlist; #使用某一 ...