Почему Python запрещает дескрипторы цепочек `@classmethod` и`@property` с 3.13? Какое решение для собственности класса? ⇐ Python
Почему Python запрещает дескрипторы цепочек `@classmethod` и`@property` с 3.13? Какое решение для собственности класса?
Отказ от ответственности < /strong>: я знаю, что уже есть похожие вопросы, но на мой вопрос больше фокусируется на причине решения, стоящего за решением, а не на самом решении. Если это считается дублированным, я удалю этот пост как можно скорее, но на самом деле я не хочу дублировать. Некоторые ответы предоставляют обходной путь, но я не могу понять, почему Python отключил цепочку @classmethod и @property . Есть ли какие -либо объяснения для этого? Сообщения, которые я прочитал, включают:
[*] Ответ, который указывает на то, что цепочка @classmethod и @property отключен с тех пор, как Python 3.13
Другое решение, которое определяет настройку ClassProperty . Но этот обходной путь не может предотвратить модификацию. Например, следующий код, полученный из исходного ответа, не поднимает исключение, когда будет предпринята попытка модификации в течение X < /code>.class classproperty(property):
def __get__(self, owner_self, owner_cls):
return self.fget(owner_cls)
def __set__(self, instance, value):
raise AttributeError("can't set attribute")
class C(object):
@classproperty
def x(cls):
return 1
print(C.x)
C.x = 2
print(C.x) # Output: 2
# no exception raised
# cannot prevent modification
< /code>
< /li>
Решение, написав свойство класса в MetaClass. Этот метод успешно предотвращает попытки модификации, но с помощью этого метода доступ к переменным класса будет возможен только через класс, а не через экземпляр.
class CMeta(type):
@property
def x(cls):
return 1
class C(object, metaclass=CMeta): ...
print(C.x)
# C.x = 2
# AttributeError: property 'x' of 'CMeta' object has no setter
# print(C().x)
# AttributeError: 'C' object has no attribute 'x'
< /code>
< /li>
< /ul>
Так есть ли определенный способ решить все вышеупомянутые проблемы и разрешить реализацию свойства класса, удовлетворяющую следующие два условия?>
Подробнее здесь: https://stackoverflow.com/questions/795 ... operty-sin
Отказ от ответственности < /strong>: я знаю, что уже есть похожие вопросы, но на мой вопрос больше фокусируется на причине решения, стоящего за решением, а не на самом решении. Если это считается дублированным, я удалю этот пост как можно скорее, но на самом деле я не хочу дублировать. Некоторые ответы предоставляют обходной путь, но я не могу понять, почему Python отключил цепочку @classmethod и @property . Есть ли какие -либо объяснения для этого? Сообщения, которые я прочитал, включают:
[*] Ответ, который указывает на то, что цепочка @classmethod и @property отключен с тех пор, как Python 3.13
Другое решение, которое определяет настройку ClassProperty . Но этот обходной путь не может предотвратить модификацию. Например, следующий код, полученный из исходного ответа, не поднимает исключение, когда будет предпринята попытка модификации в течение X < /code>.class classproperty(property):
def __get__(self, owner_self, owner_cls):
return self.fget(owner_cls)
def __set__(self, instance, value):
raise AttributeError("can't set attribute")
class C(object):
@classproperty
def x(cls):
return 1
print(C.x)
C.x = 2
print(C.x) # Output: 2
# no exception raised
# cannot prevent modification
< /code>
< /li>
Решение, написав свойство класса в MetaClass. Этот метод успешно предотвращает попытки модификации, но с помощью этого метода доступ к переменным класса будет возможен только через класс, а не через экземпляр.
class CMeta(type):
@property
def x(cls):
return 1
class C(object, metaclass=CMeta): ...
print(C.x)
# C.x = 2
# AttributeError: property 'x' of 'CMeta' object has no setter
# print(C().x)
# AttributeError: 'C' object has no attribute 'x'
< /code>
< /li>
< /ul>
Так есть ли определенный способ решить все вышеупомянутые проблемы и разрешить реализацию свойства класса, удовлетворяющую следующие два условия?>
Подробнее здесь: https://stackoverflow.com/questions/795 ... operty-sin
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как параметризовать тип класса, созданного с помощью @classmethod в Python
Anonymous » » в форуме Python - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как параметризовать тип класса, созданного с помощью @classmethod в Python
Anonymous » » в форуме Python - 0 Ответы
- 20 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как параметризовать тип класса, созданного с помощью @classmethod в Python
Anonymous » » в форуме Python - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как я могу использовать @classmethod универсального класса для параметра типа?
Anonymous » » в форуме Python - 0 Ответы
- 21 Просмотры
-
Последнее сообщение Anonymous
-