好乱。。。
Topic source# -*- coding: utf-8 -*-
# slots只能限制添加实例属性,并不能限制通过添加方法来添加类属性
def set_city(self, city):
self.city=city
class Student(object):
__slots__ = ('name', 'age')
pass
from types import MethodType
Student.set_city = MethodType(set_city, Student) # 给类绑定新的类方法
# 给类追加的方法,并不受__slots__的限制
# 通过给Student类绑定方法,实现了绑定了一个类属性,而不是实例属性
a = Student()
a.set_city('Beijing') # 调用类方法,为类属性city赋值
print(a.city)
# 所以这时,对于实例a来说,并没有实例属性city才对
del a.city # 报错!
# AttributeError: 'Student' object attribute 'city' is read-only
用户6223899516_84125
关于第一部分: 首先,结果是没有问题的,但是结论我认为是有问题的。 可通过在方法里定义限制之外的属性来添加本不能添加的属性
(当然,前提是方法没有被限制)
从你的代码来看,在slots里也添加了方法'set_city'
如果我没有理解错的话,这里是想说添加这个方法不被限制。 但是,slots只是对实例的属性做限制,并不限制类的方法和属性。 也就是说,有没有这个'set_city'
,结果是一样的。接下来,关于第二部分: 结论我认为没有问题,但是,因为set_city这个方法是一个含有self的方法,从理论上来说,即使被追加到class中去,这个方法就变成了一个类方法,但是因为依旧是self.city的形式,这个city应该是一个实例属性才对,为什么是一个类属性呢? 难道通过
MethodType
给类追加方法,这个方法中的属性也会变成类属性?类属性的定义:(引用实例属性和类属性那节)
如果Student类本身需要绑定一个属性呢?可以直接在class中定义属性,这种属性是类属性,归Student类所有: