是否可以使用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__'對應,那麼它就會很好,因此需要重寫它。 –