关于__slots__的一个小问题
本帖最后由 因为菜所以卷 于 2022-10-11 21:11 编辑class A:
__slots__=['x','y']
def __init__(self,x,y):
self.x=x
self.y=y
class B(A):
x=1
m=B(9,10)
m.__dict__ #问题:按老师讲的,在实例化对象后,对应的字典应该是空的才对,这里我既没有改属性对应的值的操作,又没有增加属性的操作,
{'x':9} 为什么字典中已经有关于x的键值对了?
希望有大佬可以指点一二,我真的有点晕了,感谢 B继承了A
创建m的时候就调用了A中的初始化函数
用9,10 分别赋给了m实例中的x, y
因为m对应的类B只有一个成员属性x,所以用m.__dict__ 只有x对应的键值对
用m.__slots__,会显示['x', 'y'] 本帖最后由 阿奇_o 于 2023-1-4 16:48 编辑
就不应该这样写呀。。
__slots__的目的是"优化",是通过禁用动态添加属性,不使用__dict__保存实例属性,来节省内存 而已。
如果继承了含__slots__的父类,那么子类也需要有自己的__slots__,否则就会像这里的 m = B(9,10) 造成混乱
—— B类的实例化,哪来的这个带两个参数初始化函数?? 而且还必须是带这两个x,y的参数?? 我B类里根本没定义呀!
—— 我只想造一个"张三"的实例,还要特别说明和造出 张三的老爸是谁?多少岁??
所以,这样写本身有很大的问题,也不符合__slots__的初衷。 总而言之,如果涉及继承,子类也要有自己的__slots__,或考虑父类是否真的需要用__slots__ 。。
页:
[1]