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

一、属性查找

  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时,则调用类里的
原文地址:https://www.cnblogs.com/schut/p/8608743.html