是否可以使用get-set属性覆盖元类的__bases__
字段(即派生自type
的类)?下面的代码适用于越来越C.__bases__
,但不设置它:覆盖元类中的__bases__
class Meta(type):
@property
def __bases__(cls):
print('Getting __bases__ via Meta.__bases__')
return super().__bases__
@__bases__.setter
def __bases__(cls, value):
print('Setting __bases__ via Meta.__bases__')
super().__bases__ = value
class A: pass
class B: pass
class C(A, B, metaclass=Meta): pass
# >>> C.__bases__
# Getting __bases__ via Meta.__bases__
# (<class '__main__.A'>, <class '__main__.B'>)
# >>> C.__bases__ = (B, A)
# Setting __bases__ via Meta.__bases__
# AttributeError: 'super' object has no attribute '__bases__'
我在setter函数尝试了一些替代的super()
,但他们没有工作:
type.__setattr__(cls, '__bases__', value)
线索递归。
object.__setattr__(cls, '__bases__', value)
给TypeError: can't apply this __setattr__ to type object
那么,这是什么归结为是如何设置cls.__bases__
场时,它是由 在元类的属性阴影。有任何想法吗?
(是的,我知道定义__bases__
属性对类的实际__mro__
没有影响,尽管这可以通过重写mro()
安排)
不,你不能。你为什么要这样做,这个问题解决了什么问题? –
而'super()'只支持非数据描述符(所以只有'__get__')。没有'__set__'被支持,所以'super().__ bases__ = value'将尝试在超级代理上使用__bases__'属性,而不是在任何基类上。 '__bases__'不能改变。 –
回复:为什么我想这样做:这个想法是实现一种“类代理”,它通过复制它的'__mro__'来转发对代理类的方法和属性访问。如果类代理的'__bases__'也与代理类的'__bases__'对应,那么它就会很好,因此需要重写它。 –