Запретить создание новых атрибутов за пределами __init__ - PullRequest
59 голосов
/ 30 августа 2010

Я хочу иметь возможность создать класс (в Python), который после инициализации __init__ не принимает новые атрибуты, но принимает модификации существующих атрибутов. Есть несколько способов взлома, которые я вижу, чтобы сделать это, например, с помощью метода __setattr__, такого как

def __setattr__(self, attribute, value):
    if not attribute in self.__dict__:
        print "Cannot set %s" % attribute
    else:
        self.__dict__[attribute] = value

и затем редактирование __dict__ непосредственно внутри __init__, но мне было интересно, есть ли «правильный» способ сделать это?

Ответы [ 11 ]

0 голосов
/ 13 июня 2018

улучшение по сравнению с этим отличным решением с использованием __slots__ состоит в том, чтобы позволить __init__ методу определить разрешенные атрибуты, а затем установить атрибут __slots__ с текущим классом __dict__

Преимущество состоит в том, что он позволяет избежать двойного обновления при добавлении атрибута в __init__:

class A:
    def __init__(self):
        self.a = 12
        self.b = 34
        self.__slots__ = self.__dict__


a = A()
a.b = 33   # okay
a.c = 22   # AttributeError: 'A' object has no attribute 'c'
...