zoukankan      html  css  js  c++  java
  • 5 属性查找与绑定方法

    面向对象学习目录

    1 面向对象介绍

    2 类、实例、属性、方法详解

    3 面向过程与面向对象进一步比较

    4 类与对象

    5 属性查找与绑定方法

    6 小结

    7 继承与派生

    8 组合

    9 抽象类

    10 多态

    11 封装

    12 绑定方法与非绑定方法

    13 内置方法(上)

    14 内置方法(中)之描述符

    15 内置方法(下)

    16 元类


    属性查找

      类有两种属性:数据属性和函数属性
      1、类的数据属性是所有对象共享的
    1 #类的数据属性是所有对象共享的,id都一样
    2 print(id(OldboyStudent.school)) #4377347328
    3 
    4 print(id(s1.school)) #4377347328
    5 print(id(s2.school)) #4377347328
    6 print(id(s3.school)) #4377347328
      在obj.school会先从obj自己的名称空间里找school,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常
     
      2、类的函数数据是绑定给对象用的,称为绑定到对象的方法
    1 #类的函数属性是绑定给对象使用的,obj.method称为绑定方法,内存地址都不一样
    2  
    3 print(OldboyStudent.learn) #<function OldboyStudent.learn at 0x1021329d8>
    4 print(s1.learn) #<bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x1021466d8>>
    5 print(s2.learn) #<bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x102146710>>
    6 print(s3.learn) #<bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x102146748>>
    7  
    8 #ps:id是python的实现机制,并不能真实反映内存地址,如果有内存地址,还是以内存地址为准
     

    绑定方法

      定义类并实例化出三个对象
     1 class OldboyStudent:
     2   school='oldboy'
     3   def __init__(self,name,age,sex):
     4     self.name=name
     5     self.age=age
     6     self.sex=sex
     7 
     8   def learn(self):
     9     print('%s is learning' %self.name) #新增self.name
    10  
    11   def eat(self):
    12     print('%s is eating' %self.name)
    13  
    14   def sleep(self):
    15     print('%s is sleeping' %self.name)
    16  
    17  
    18 s1=OldboyStudent('李坦克','',18)
    19 s2=OldboyStudent('王大炮','',38)
    20 s3=OldboyStudent('牛榴弹','',78)
      类中定义的函数(没有被任何装饰器装饰的)是类的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数
    1 OldboyStudent.learn(s1) #李坦克 is learning
    2 OldboyStudent.learn(s2) #王大炮 is learning
    3 OldboyStudent.learn(s3) #牛榴弹 is learning
     
      类中定义的函数(没有被任何装饰器装饰的),其实主要是给对象使用的,而且是绑定到对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法
      强调:绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,谁来调用,就会将‘谁’本身当做第一个参数传给方法,即自动传值(方法__init__也是一样的道理)
    1 s1.learn() #等同于OldboyStudent.learn(s1)
    2 s2.learn() #等同于OldboyStudent.learn(s2)
    3 s3.learn() #等同于OldboyStudent.learn(s3)
      注意:绑定到对象的方法的这种自动传值的特征,决定了在类中定义的函数都要默认写一个参数self,self可以是任意名字,但是约定俗成地写出self。

    类即类型

      python中一切皆为对象,且python3中类与类型是一个概念,类型就是类
     1 #类型dict就是类dict
     2 >>> list
     3 <class 'list'>
     4  
     5 #实例化的到3个对象l1,l2,l3
     6 >>> l1=list()
     7 >>> l2=list()
     8 >>> l3=list()
     9  
    10 #三个对象都有绑定方法append,是相同的功能,但内存地址不同
    11 >>> l1.append
    12 <built-in method append of list object at 0x10b482b48
    13 
    14 >>> l2.append
    15 <built-in method append of list object at 0x10b482b88
    16 
    17 >>> l3.append
    18 <built-in method append of list object at 0x10b482bc8>
    19  
    20 #操作绑定方法l1.append(3),就是在往l1添加3,绝对不会将3添加到l2或l3
    21 >>> l1.append(3)
    22 >>> l1
    23 [3]
    24 >>> l2
    25 []
    26 >>> l3
    27 []
    28 
    29 #调用类list.append(l3,111)等同于l3.append(111)
    30 >>> list.append(l3,111)  # l3.append(111)
    31 >>> l3
    32 [111]

    小节练习

    练习1:编写一个学生类,产生一堆学生对象, (5分钟)
    要求:
    1. 有一个计数器(属性),统计总共实例了多少个对象
    练习2:模仿王者荣耀定义两个英雄类, (10分钟)
    要求:
    1. 英雄需要有昵称、攻击力、生命值等属性;
    2. 实例化出两个英雄对象;
    3. 英雄之间可以互殴,被殴打的一方掉血,血量小于0则判定为死亡。
  • 相关阅读:
    05Linux文件修改
    07Linux基本权限
    09Linux软件安装
    搬家
    web项目和单元测试
    session_start() 对 HTTP_REQUEST扩展/fsockopen函数 的影响
    从不同架构的角度进行web项目的需求分析和系统设计
    程序中的风险控制
    【原创】 书籍推荐
    【转载】10个效果最佳的编程字体
  • 原文地址:https://www.cnblogs.com/oceanicstar/p/8847005.html
Copyright © 2011-2022 走看看