RT,众所周知__slots__用在继承里坑非常多。比如说有两个类A,B,B是A的子类。如果A,B中都定义了__slots__。那么B中slots会覆盖掉A中的。再比如说在多重继承中,如果有两个父类都有__slots__属性。那么就会引发TypeError。解释器告诉你multiple bases have instance lay-out conflict。
对第一种覆盖的情况,可以用B.__slots__.extend(A.__slots__)解决。但是如果你想把类提供给别人用,就不能指望使用类的人也会老老实实extend()。这种情况可以给基类指定一个元类,在元类中重写__new__解决。
第二种情况比较复杂,为了不让解释器在处理基类时抛出TypeError,我认为可能需要捕获解释器从基类构造类的过程。然而我不懂背后的机制。。。有没有高手比较了解这方面的?怎么处理__slots__用在多重继承的情况?
对第一种覆盖的情况,可以用B.__slots__.extend(A.__slots__)解决。但是如果你想把类提供给别人用,就不能指望使用类的人也会老老实实extend()。这种情况可以给基类指定一个元类,在元类中重写__new__解决。
第二种情况比较复杂,为了不让解释器在处理基类时抛出TypeError,我认为可能需要捕获解释器从基类构造类的过程。然而我不懂背后的机制。。。有没有高手比较了解这方面的?怎么处理__slots__用在多重继承的情况?