• 实例化产生对象和绑定关系


    类与对象

    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]
    

      

  • 相关阅读:
    java.lang.NoSuchMethodError
    asm相关内容想下载(包括 jar 包)
    Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type
    用Navicat连接mysql报错:2003-Can't connect to MySql server on '10.100.0.109'(10039)
    The type java.lang.reflect.AnnotatedElement cannot be resolved. It is indirectly referenced from required .class files
    The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    交通测速方式
    卡口和电子警察的区别
    Myeclipse连接Mysql数据库时报错:Error while performing database login with the pro driver:unable
    在window上安装mysql
  • 原文地址:https://www.cnblogs.com/taostaryu/p/8795470.html
Copyright © 2020-2023  润新知