• 面向对象之属性查找与绑定方法


    一、属性查找

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

       <1> 类的属性数据是所有对象共享的。  

    #!/usr/bin/env python3
    #-*- coding:utf-8 -*-
    
    class School_learn:
        job = 'student'
        def __init__(self,name,age,sex):
            '''
            # 添加对象独有的属性
             #    self:student1
            :param name: '小明'
            :param age: 20
            :param sex: '男'
            '''
            self.Name = name   # student1.Name = '小明'
            self.Age = age      # student1.Age = 20
            self.Sex = sex      # student1.Sex = '男'
    
        def study(self):
            print('%s is studying hard!'%self.Name)
        def play_game(self):
            print('play games as little as you can')
        def read(self):
            print('read books more and more')
    stu1 = School_learn('墨离',19,'')
    stu2 = School_learn('小白',20,'')
    
    # 类中的数据属性是所有对象共有的,指向同一块内存地址
    print(School_learn.job,id(School_learn.job)) # student 2380857831584
    print(stu1.job,id(stu1.job))                 # student 2380857831584
    print(stu2.job,id(stu2.job))                #  student 2380857831584

      2、类的函数数据是绑定给对象用的,称为绑定到队象的方法。

    #类的函数属性是绑定给对象使用的,obj.method称为绑定方法,内存地址都不一样
    
    print(stu1.study) # <bound method School_learn.study of <__main__.School_learn object at 0x00000226751B3320>>
    print(stu2.study) # <bound method School_learn.study of <__main__.School_learn object at 0x00000226751B3358>>

    二、绑定方法

      1、定义类并实例化出对象

    class School_learn:
        job = 'student'
        def __init__(self,name,age,sex):
            '''
            # 添加对象独有的属性
             #    self:student1
            :param name: '小明'
            :param age: 20
            :param sex: '男'
            '''
            self.Name = name   # student1.Name = '小明'
            self.Age = age      # student1.Age = 20
            self.Sex = sex      # student1.Sex = '男'
    
        def study(self):
            print('%s is studying hard!'%self.Name)
        def play_game(self):
            print('play games as little as you can')
        def read(self):
            print('read books more and more')
    stu1 = School_learn('墨离',19,'')
    stu2 = School_learn('小白',20,'')
    print(School_learn.__dict__) # __init__方法查看属性
    print(stu1.__dict__) # {'Name': '墨离', 'Age': 19, 'Sex': '女'}
    print(stu2.__dict__) # {'Name': '小白', 'Age': 20, 'Sex': '男'}

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

    # 类中的函数属性是绑定给对象,绑定到不同对象是不同的绑定方法;对象调用绑定方法时,会把对象本身当作第一个参数传入,传给self
    print(School_learn.study) # <function School_learn.study at 0x0000015FD91C8B70> 函数地址
    School_learn.study(stu1) # 墨离 is studying hard!  需要传第一个参数
    School_learn.study(stu2) # 小白 is studying hard!

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

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

    stu1.study() #  第一个参数是本身,不用传,其余参数照常传,等同于School_learn.study(stu1)
    stu2.study() # 等同于School_learn.study(stu2)

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

    三、对象属性查找的顺序 

      # 第一步:在对象自身的名称空间里找

      # 第二步:对象自身里未找到,在类的名称空间里查找,再没找到,会报错

      例如:

    #stu1.x = '对象自身'
    School_learn.x = '类里'
    print(School_learn.__dict__)
    print(stu1.__dict__) # {'Name': '墨离', 'Age': 19, 'Sex': '女', 'x': '对象自身'}
    print(stu1.x) # 类里 # 第1行被注释,即对象本身里不存在x时,则调用类里的
  • 相关阅读:
    VA对于开发QT是神器,VA自动补全QT
    64位下好神奇啊(增加了PatchGuard技术保护自己,SSDT是相对地址,参数通过寄存器与rdi来传递)
    贵在坚持
    VC程序查错之内存访问异常
    QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
    QTimer源码分析(以Windows下实现为例)
    Go语言的优点(oschina讨论)
    致诸位新程序员:来自Chuck Jazdzewski慈父般的忠告
    poj1483 It's not a Bug, It's a Feature!
    App应用与思考
  • 原文地址:https://www.cnblogs.com/schut/p/8608743.html
Copyright © 2020-2023  润新知