属性查找
类有两种属性:数据属性和函数属性
1.数据属性是共享的,数据属性公用一块内存
2.类的函数数据是绑定给对象用的,称为绑定到对象的方法
class student:
mingzu='汉族' #数据属性
def __init__(self,name,age,sex): #函数属性
self.name=name
self.age=age
self.sex=sex
def learn(self): #函数属性
print('is learning')
def eat(self): #函数属性
print('is eating')
def sleep(self): #函数属性
print('is sleeping')
student1=student('张三',18,'male')
student2=student('李四',20,'male')
student3=student('王二丫',18,'female')
#数据属性是共享的
print(id(student.mingzu)) #3070164795616
print(id(student1.mingzu)) #3070164795616
print(id(student2.mingzu)) #3070164795616
print(id(student3.mingzu)) #3070164795616
#函数属性绑定到相应的对象
print(id(student.learn)) #2380961904432
print(id(student1.learn)) #2380959923400
print(id(student2.learn)) #2380959923400
print(id(student3.learn)) #2380959923400
绑定的方法
类中定义的函数(没有被任何装饰器装饰的)是类的函数属性,类可以使用,但必须遵循函数的参数规则,有几个参数需要传几个参数
强调:绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,谁来调用,就会将‘谁’本身当做第一个参数传给方法,即自动传值(方法__init__也是一样的道理)
class student:
mingzu='汉族' #数据属性
def __init__(self,name,age,sex): #函数属性
self.name=name
self.age=age
self.sex=sex
def learn(self): #函数属性
print('%s is learning' %self.name)
def eat(self): #函数属性
print('%s is eating' %self.name)
def sleep(self): #函数属性
print('%s is sleeping' %self.name)
student1=student('张三',18,'male')
student2=student('李四',20,'male')
student3=student('王二丫',18,'female')
student1.learn() #等价于student.learn(student1)
student2.learn() #等价于student.learn(student2)
student3.learn() #等价于student.learn(student3)
student.learn(student1)
#运行结果:
# 张三 is learning
# 李四 is learning
# 王二丫 is learning
注意:绑定到对象的方法的这种自动传值的特征,决定了在类中定义的函数都要默认写一个参数self,self可以是任意名字,但是约定俗成地写出self。