Discuss / Python / __slots__能不能通过setattr或者直接关联来动态追加?

__slots__能不能通过setattr或者直接关联来动态追加?

Topic source

如题,比如说子类本来没有定义__slots__

class Student(object):
    __slots__ = ('name','age') # 用tuple定义允许绑定的实例属性名称

class SubStudent(Student): # 创建一个Student的子类
    pass

然后,我想让这个SubStudent子类也拥有__slots__, 我试了一下下面的两种方法,应该是都不可以。 方法1:使用setattr

g = SubStudent()  # 创建子类的实例对象
setattr(SubStudent,'__slots__',('score','sex'))
print(getattr(SubStudent,'__slots__',404)) # 虽然__slots__属性是存在的

g.sex = 'man'
print(g.sex)

g.city = 'dalian' # 但是,这里依然没有起到限制的作用
print(g.city)

方法2:直接关联(还是上面的这个实例g)

SubStudent.__slots__=('score','sex')
print(hasattr(SubStudent,'__slots__'))
print(dir(g)) # 存在__slots__

g.city = 'dalian' # 依旧没有任何作用,并没有出错
print(g.city)

我一定是没有理解这个setattr和直接关联的区别,谁能给解释下呢? 另外,如果这两个方法都不行,有其他办法可以实现这个吗?

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

__slots__的设计目的是为了省内存,不要想动态搞这些,方案太复杂,不如不用

第一次被廖老师翻牌子,鸡冻~~~ 关于上面的问题,既然是这样,就暂且不研究了! 多谢


  • 1

Reply