Использование (теперь удален) комментарий Павла Anossov в:
class met(type):
def __init__(cls, name, bases, dct):
super(met, cls).__init__(name, bases, dct)
cls._test_member = "test_value"
object = met('object', (object,), {})
class A(object):
pass
print(A._test_member)
печатает
test_value
Обратите внимание, что класс может иметь только один метакласса. (Так как, в конце концов, любой объект может иметь только один тип). Но, кроме того, метакласс класса должен быть (нестрогим) подклассом метаклассов всех его оснований. Другими словами, метакласс класса и метаклассы всех его баз либо должны быть одинаковыми, либо все эти метаклассы должны быть подклассами друг друга. Таким образом, вышеупомянутое решение может не работать, если класс пытается использовать метакласс, который не является подклассом met
.
Например,
class met(type):
def __init__(cls, name, bases, dct):
super(met, cls).__init__(name, bases, dct)
cls._test_member = "test_value"
object = met('object', (object,), {})
class someothertype(type): pass
class B(object):
__metaclass__ = someothertype
поднимает
TypeError: Error when calling the metaclass bases
metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
Я не знал, что вы можете переопределить объект, используя его в качестве базы. Очень подлый. – dilbert
@PavelAnossov: Если вы хотите опубликовать ответ, я удалю его. – unutbu
@unutbu: Я заменил 'setattr (cls," _test_member "," test_value ")' с его более обычной и прямой формой. – EOL