5.3 属性查找和绑定方法

类的属性查找

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

1、类的数据属性是所有对象共享的

class Student:
    school_name = '北京大学'
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex


s1 = Student('cmz1', 20, "male")
s2 = Student('cmz1', 20, "male")
s3 = Student('cmz1', 20, "male")

#类的数据属性是所有对象共享的,id都一样
print(id(s1.school_name))
print(id(s2.school_name))
print(id(s3.school_name))

输出结果
7668024
7668024
7668024

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

class Student:
    school_name = '北京大学'
    def __init__(self, name, age, sex):
        self.name = name
        self.age = age
        self.sex = sex
    def run(self):
        print("%s is running" % self.name)


s1 = Student('cmz1', 20, "male")
s2 = Student('cmz1', 20, "male")
s3 = Student('cmz1', 20, "male")

print(s1.run)
print(s2.run)
print(s3.run)

结果是
<bound method Student.run of <__main__.Student object at 0x0000000000E5DDA0>>
<bound method Student.run of <__main__.Student object at 0x0000000000E5DDD8>>
<bound method Student.run of <__main__.Student object at 0x0000000000E5DE10>>
#ps:id是python的实现机制,并不能真实反映内存地址,如果有内存地址,还是以内存地址为准

在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常

绑定方法

定义类并实例化出三个对象

class Student:
    school='北京大学'
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    def learn(self):
        print('%s is learning' %self.name) #新增self.name

    def eat(self):
        print('%s is eating' %self.name)

    def sleep(self):
        print('%s is sleeping' %self.name)

s1 = Student("张三", 20, "male")
s2 = Student("李四", 30, "male")
s3 = Student("莉莉", 40, "male")

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

s1.learn()
s2.learn()
s3.learn()

结果是
张三 is learning
李四 is learning
莉莉 is learning

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

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

s1.learn()  == Student(s1)
s2.learn()  == Student(s2)
s3.learn()  == Student(s3)

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

类即类型

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]

 

posted @ 2018-02-09 14:06  Love_always_online  阅读(167)  评论(0编辑  收藏  举报