Этот вопрос касается проблемы только для чтения для объектов, которые основаны на super()
, и если/как супер может/должен управлять __setattr__
на подклассах.Разрешить супер контролировать __setattr__ в подклассах
Контекст:
Есть ли способ, чтобы написать мету класса или descriptor таким образом, что все классы, которые являются подклассами класса, содержащего атрибут self.read_only = True
не может выполнять подклассы функции, где GetAttr является начало с «set_», но где self.read_only = False
может?
Я имею в виду, что переопределение object.__setattr__(self, name, value)
:
Вызывается, когда присвоение атрибута попытка. Это называется вместо обычного механизма (т. Е. Сохраняет значение в экземпляре словаря ). name - это имя атрибута, значение - это значение, которое должно быть присвоено ему .
... является правильным направлением, но я сомневаюсь, правильна ли моя интерпретация документации.
Пример:
Супер согласно предписанию системщиком:
class BaseMessage(object):
def __init__(self, sender, receiver, read_only=True):
self.sender = sender
self.receiver = receiver
self.read_only = read_only
def __setattr__(self, name, value):
if self.read_only:
raise AttributeError("Can't set attributes as message is read only.")
else:
# ? set attribute...(suggestion welcome)
def get_sender(self): # Is a "get" and not "set" call, so it should be callable disregarding self.read_only's value.
return self.sender
def get_receiver(self):
return self.receiver
Sub сделанное системой-расширитель, который имеет ограниченное понимание всех последствий:
class MutableMessage(BaseMessage):
def __init__(self, sender, receiver, topic, read_only=False):
super().__init__(sender=sender, receiver=receiver, read_only=read_only)
self.topic = topic
# this call should be okay as super's property is read_only=False.
def set_topic_after_init(new_topic):
self.topic = topic
class ImmutableMessage(BaseMessage):
def __init__(self, sender, receiver, topic): # read_only=True !
super().__init__(sender=sender, receiver=receiver, read_only=read_only)
self.topic = topic
# this call should fail as super's property is read_only=True.
def set_topic_after_init(new_topic):
self.topic = topic
Комментарий к примеру
В MutableMessage
система расширитель прямо заявляет, что read_only является ложным и заведомо известно, что о последствиях добавления функции set_topic
.
В ImmutableMessage
(ниже), система-расширитель забывает объявить, что сообщение должно быть read_only = False
, которые должны привести к super
с __setattr__
к raise AttributeError
:
Основной вопрос: Будет ли использование, как показано в приведенном ниже примере достаточно последовательно применять все классы, основанные на классе BaseMessage?
Думайте обо мне как новичок в метапрограмме. Поэтому объяснение любых недоразумений и/или расширение и исправление моего примера было бы верховным. Я понимаю hierarchy [1], но не знаю, что делает python за шторами во время процесса наследования.
Спасибо ...
[1]: Иерархия
Порядок поиска, Python использует для атрибутов выглядит следующим образом:
__getattribute__
и__setattr__
- дескрипторы данных, как собственность
- Переменные от объекта
__dict__
- Non-Data descrip TORs (например, методы) и другие переменные класса
__getattr__
Поскольку
__setattr__
является первым в очереди, если у вас есть тот, который вы должны сделать его умным, если не хотите, чтобы обрабатывать все атрибуты настройки для вашего класса. Он может быть умным одним из двух способов.a. Заставить его обрабатывать только определенные атрибуты набора или, или
b. заставить обрабатывать все, кроме некоторого набора атрибутов.
Для тех, с которыми вы не хотите его обрабатывать, позвоните по телефону
super().__setattr__
.
Похожие вопросы: