Discuss / Python / 自己的总结

自己的总结

Topic source

一、给类和实例动态绑定属性和方法:

1.绑定属性:

class Student:

    pass

s = Student()

Student.name = '学生'

s.name = '学生s'

2.绑定方法:

from types import MethodType

def set_age(self, age):

    self.age = age

Student.set_age = MethodType(set_age, Student)

s.set_age = MethodType(set_age, s)

二、__slots__使用:

限制类的实例的属性添加

Class Student:

    __slots__ = ('name', 'age')

s2 = Student()

#s2为Student类的实例,类中没有name和age属性的前提下,可以添加name和age属性

#类中存在name和age属性,python返回错误,属性只可读

#添加实例属性

s2.name = 's2'

s2.age = 20

#添加类属性

Student.name = '学生'

Student.age = 10

#实例和类同时存在相同名字属性,按理说实例属性应该覆盖掉了类属性

s2.name 

>>'学生‘

#实例属性被类属性覆盖,再次修改实例属性,python提示只可读

s2.name = 's2'

AttributeError: 'Student' object attribute 'name' is read-only

挺奇怪的。。。。应该是MethodType的内部逻辑吧??

而且用MethodType给类绑定方法后,实例调用相关方法后设置的是类的属性而不是实例属性。

有点迷。。。。。

上面打错了。。。补充一下

更正:

AttributeError: 'Student' object attribute 'name' is read-only

挺奇怪的。。。。

而且用MethodType给类绑定方法后,实例调用相关方法后设置的是类的属性而不是实例属性。

有点迷。。。。。

补充:

子类定义中没有slots参数的情况不继承父类__slots__参数,

有slots参数的情况继承父类__slots__参数+自己的__slots__参数


  • 1

Reply