鱼C论坛

 找回密码
 立即注册
查看: 3775|回复: 2

关于__slots__的一个小问题

[复制链接]
发表于 2022-10-11 20:28:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 因为菜所以卷 于 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的键值对了?



希望有大佬可以指点一二,我真的有点晕了,感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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']
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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__ 。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-25 03:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表