一、属性查找
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时,则调用类里的