因为菜所以卷 发表于 2022-10-11 20:28:32

关于__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的键值对了?



希望有大佬可以指点一二,我真的有点晕了,感谢

_Jaxen_ 发表于 2023-1-4 13:56:50

B继承了A
创建m的时候就调用了A中的初始化函数
用9,10 分别赋给了m实例中的x, y
因为m对应的类B只有一个成员属性x,所以用m.__dict__ 只有x对应的键值对
用m.__slots__,会显示['x', 'y']

阿奇_o 发表于 2023-1-4 16:43:20

本帖最后由 阿奇_o 于 2023-1-4 16:48 编辑

就不应该这样写呀。。

__slots__的目的是"优化",是通过禁用动态添加属性,不使用__dict__保存实例属性,来节省内存 而已。
如果继承了含__slots__的父类,那么子类也需要有自己的__slots__,否则就会像这里的 m = B(9,10) 造成混乱
—— B类的实例化,哪来的这个带两个参数初始化函数?? 而且还必须是带这两个x,y的参数?? 我B类里根本没定义呀!
—— 我只想造一个"张三"的实例,还要特别说明和造出 张三的老爸是谁?多少岁??

所以,这样写本身有很大的问题,也不符合__slots__的初衷。 总而言之,如果涉及继承,子类也要有自己的__slots__,或考虑父类是否真的需要用__slots__ 。。
页: [1]
查看完整版本: 关于__slots__的一个小问题