Поскольку вы существенно изменили вопрос, вот новый ответ.
- Some_Inst.inst_prop = 'Set with Some_Inst.inst_prop', Some_Inst.__class__.inst_prop = '<property object at 0x000002062A3C9B38>'
Как свойство экземпляра Some_Inst
, оценка Some_Inst.inst_prop
возвращает вам значение свойства, а оценка Some_Inst.__class__.inst_prop
get Вы, что inst_prop
для класса: собственность. Это свойство определено в классе, поэтому оно разрешается в его значение для экземпляра и в свойство для класса.
То же самое верно для norm_prop
в контексте вашего первого вопроса.
Что касается второго вопроса: «Я думал, что целью метакласса было создание свойства Class. Почему тогда установка Some_Inst.meta_prop = "Set with Some_Inst.meta_prop"
изменяет значение экземпляра, но не значение класса?»
Потому что Some_class
не имеет атрибута meta_prop
, пока вы не назначите его с помощью Some_Inst.meta_prop = "Set with Some_Inst.meta_prop"
. meta_prop
- это свойство, которое вы определили в мета-классе, но поскольку SomeClass
не наследуется от SomeClassMeta
(оно просто имеет мета-класс), оно не включено в SomeClass
.
Почему вы хотите использовать мета-классы для определения свойств класса, а не просто определить их в классе? По словам Тима Питерса:
"Метаклассы - это более глубокие маги c, чем могут волноваться 99% пользователей. Если вам интересно, нужны ли они вам, это не так (люди, которые действительно нуждаются в них") знаю с уверенностью, что они им нужны, и не нужно объяснять, почему). "
Эта статья имеет отличное дальнейшее объяснение: https://realpython.com/python-metaclasses/