zoukankan      html  css  js  c++  java
  • 实例化产生对象和绑定关系

    类与对象

    1、类
    对象是特征与技能的结合体,那类就是一系列对象相同的特征与技能的结合体

    2、在现实世界中:一定先有对象,后来随着人类文明的发展总结出的类
    对象是具体存在的,而类只是一种抽象概念

    3、在程序中,务必保证:先定义类,后调用类来产生对象

    现实生活中的对象:
        对象1:
            特征:
                school="Oldboy"
                name="马冬梅"
                age=18
                sex="female"
            技能:
                学习
                选课
    
        对象2:
            特征:
                school="Oldboy"
                name="甜蜜蜜"
                age=21
                sex="male"
            技能:
                学习
                选课
    
        对象3:
            特征:
                school="Oldboy"
                name="原石开"
                age=22
                sex="male"
            技能:
                学习
                选课
    
    现实生活中的老男孩学生类:
         相同的特征
                school="Oldboy"
         相同的技能
                学习
                选课
    '''
    #1、程序中的类
    class OldboyStudent:
        # 用变量表示特征
        school="Oldboy"
    
        # stu1, "马冬梅", 18, 'female'
        def __init__(self,name,age,sex): #self=stu1     name= "马冬梅"   age=18     sex="female"
            # print('==========init run=============>')
            self.name=name # stu1.name = "马冬梅"
            self.age=age  # stu1.age = 18
            self.sex=sex  # stu1.sex = "female"
    
    
        #  用函数表示技能
        def learn(self):
            print('is learning...',self)
    
        def choose(self):
            print('choose course...')
    
    # 在程序中:必须先定义类 - -----》调用类 - -----》对象
    
    # stu1=OldboyStudent()
    # stu1.NAME='马冬梅'
    # stu1.AGE=18
    # stu1.SEX="female"
    #
    # stu2=OldboyStudent()
    # stu2.NAME='甜蜜蜜'
    # stu2.AGE=21
    # stu2.SEX="male"
    #
    # stu3=OldboyStudent()
    # stu3.NAME='原石开'
    # stu3.AGE=22
    # stu3.SEX="male"
    #
    # print(stu1.NAME,stu1.school)
    # print(stu2.NAME,stu2.school)
    # print(stu3.NAME,stu3.school)
    # 上述产生的三个对象都一样了
    
    
    # 调用类发生哪些事:
    #1、首先会产生一个空对象stu1
    #2、会自动触发类内部的__init__函数
    #3、然后将空对象stu1连同调用类时括号内的参数组成(stu1,"马冬梅",18,'female'),将这四个参数一起传给__init__函数
    
    stu1=OldboyStudent("马冬梅",18,'female')  #OldboyStudent.__init__(stu1,"马冬梅",18,'female')
    stu2=OldboyStudent("甜蜜蜜",21,'male') #OldboyStudent.__init__(stu2,"甜蜜蜜",21,'male')
    stu3=OldboyStudent("原石开",22,'male')
    
    
    # print(stu1.name,stu1.age,stu1.sex)
    # print(stu2.name,stu2.age,stu2.sex)
    # print(stu3.name,stu3.age,stu3.sex)
    

      

    实例化产生对象

    调用类---》产生类的对象,该对象也可以称为类的一个实例,调用类的过程也称为类的实例化

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

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

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

    #类的数据属性是所有对象共享的,id都一样
    print(id(OldboyStudent.school))
    
    print(id(s1.school))
    print(id(s2.school))
    print(id(s3.school))
    
    '''
    4377347328
    4377347328
    '''
    
    
    
    #类的函数属性是绑定给对象使用的,obj.method称为绑定方法,内存地址都不一样
    #ps:id是python的实现机制,并不能真实反映内存地址,如果有内存地址,还是以内存地址为准
    print(OldboyStudent.learn)
    print(s1.learn)
    print(s2.learn)
    print(s3.learn)
    '''
    <function OldboyStudent.learn at 0x1021329d8>
    <bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x1021466d8>>
    <bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x102146710>>
    <bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x102146748>>
    '''
    

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

    对象之间的交互

    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_value
    455
    >>> r1.attack(g1)
    >>> g1.life_value
    401 
    

    补充:

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

      garen_hero.W()

      garen_hero.E()

      garen_hero.R()

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

    #改写
    class OldboyStudent:
        school='oldboy'
        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=OldboyStudent('李坦克','男',18)
    s2=OldboyStudent('王大炮','女',38)
    s3=OldboyStudent('牛榴弹','男',78)
    

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

    OldboyStudent.learn(s1) #李坦克 is learning
    OldboyStudent.learn(s2) #王大炮 is learning
    OldboyStudent.learn(s3) #牛榴弹 is learning
    

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

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

    s1.learn() #等同于OldboyStudent.learn(s1)
    s2.learn() #等同于OldboyStudent.learn(s2)
    s3.learn() #等同于OldboyStudent.learn(s3)
    

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

    类即类型

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

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

    #类型dict就是类dict
    >>> list
    <class 'list'>
    
    #实例化的到3个对象l1,l2,l3
    >>> l1=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或l3
    >>> l1.append(3)
    >>> l1
    [3]
    >>> l2
    []
    >>> l3
    []
    #调用类list.append(l3,111)等同于l3.append(111)
    >>> list.append(l3,111) #l3.append(111)
    >>> l3
    [111]
    

      

  • 相关阅读:
    HAProxy的基础配置详解
    Nginx七层负载均衡的几种调度算法
    基于PXE网络启动的Linux系统自动化安装
    centos源码编译安装新版本内核
    Linux计划任务管理
    Linux多网卡绑定(bond)及网络组(team)
    Linux逻辑卷管理(LVM)
    pandas基础操作
    subprocess
    python常用库(转)
  • 原文地址:https://www.cnblogs.com/taostaryu/p/8795470.html
Copyright © 2011-2022 走看看