1.属性查找
类包含两种属性:数据属性和函数属性
x='global'
class LuffyStudent:
school='luffycity' #数据属性
def __init__(self,name,sex,age): #函数属性
self.Name=name
self.Sex=sex
self.Age=age
#stu1.Name='王二丫'
#stu1.Sex='女'
#stu1.Age=18
def learn(self,x): #函数属性
print('%s is learning %s' %(self.Name,x))
def eat(self): #函数属性
print('%s is sleeping' %self.Name)
#产生对象
s1=LuffyStudent('王二丫','女',18)
s2=LuffyStudent('李三炮','男',38)
s3=LuffyStudent('张铁蛋','男',48)
1.1类的数据属性是所有对象共有的
#类的数据属性是所有对象共享的,id都一样
print(id(LuffyStudent.school))
print(id(s1.school)) #4377347328
print(id(s2.school)) #4377347328
print(id(s3.school)) #4377347328
1.2类的函数数据是绑定给对象用的,称为绑定到对象的方法
类的函数属性是绑定给对象使用的,obj.method称为绑定方法,内存地址都不一样
print(OldboyStudent.learn) #<function OldboyStudent.learn at 0x1021329d8>
print(s1.learn) #<bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x1021466d8>>
print(s2.learn) #<bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x102146710>>
print(s3.learn) #<bound method OldboyStudent.learn of <__main__.OldboyStudent object at 0x102146748>>
#ps:id是python的实现机制,并不能真实反映内存地址,如果有内存地址,还是以内存地址为准
在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常
2.绑定方法
类中定义的函数(没有被任何装饰器装饰的),主要是给对象使用的,而且是绑定到对象的,虽然所有对象指向的都是相同的功能,但是绑定到不同的对象就是不同的绑定方法。
强调:绑定到对象的方法的特殊之处在于,绑定给谁就由谁来调用,谁来调用,就会将‘谁’本身当做第一个参数传给方法,即自动传值(方法__init__也是一样的道理)
s1.learn() #等同于OldboyStudent.learn(s1)
s2.learn() #等同于OldboyStudent.learn(s2)
s3.learn() #等同于OldboyStudent.learn(s3)
注意:绑定到对象的方法的这种自动传值的特征,决定了在类中定义的函数都要默认写一个参数self,self可以是任意名字,但是约定俗成地写出self。
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]