Наследовать от Dict с частными значениями на объекте - PullRequest
0 голосов
/ 22 октября 2018

РЕДАКТИРОВАТЬ - Я понял это

Итак, у меня есть класс, как определено ниже:

class BaseLocation(dict):
    _ao = None
    _op = None

    def __init__(self, iterable=None):
        if iterable is None:
            iterable = {}
        self.update(iterable)
    def __setattr__(self, key, value):
        """sets the attribute"""
        if key.startswith("_"):
            setattr(self, key, value)
        else:
            dict.__setitem__(self, key, value)
    def __setattribute__ (self, key, value):
        super(BaseGeometry, self).__setattribute__(key, value)
    def __setitem__(self, key, value):
        dict.__setitem__(self, key, value)

    def __getattribute__ (self, name):
        return super(BaseGeometry, self).__getattribute__(name)

    def __getattr__(self, name): # support item attributes
        try:
            return dict.__getitem__(self, name)
        except:
            raise AttributeError("'%s' object has no attribute '%s'" % (type(self).__name__, name))

    def __getitem__(self, k): 
        return dict.__getitem__(self, k)

В возвращенном словаре не отображаются значения "_"это нормально.Я хочу, чтобы эти атрибуты были приватными и не были видны пользователю.У меня вопрос такой, как мне установить эти значения?Если я делаю BaseLocation._ao = (1,0) и печатаю объект BaseLocation, я вижу _ao в словаре, который я никогда не хочу видеть.Итак, что мне нужно сделать, чтобы скрыть эту переменную?

bl = BaseLocation({'x':1,'y':10})
bl._ao = 1
print(bl)

Вы увидите, что _ao появляется в поле зрения объекта.

1 Ответ

0 голосов
/ 22 октября 2018

** Решение: **

class BaseGeometry(dict):
    _ao = None
    _op = None

    def __init__(self, iterable=None):
        if iterable is None:
            iterable = {}
        self.update(iterable)
    def __setattr__(self, key, value):
        """sets the attribute"""
        if key in {'_ao','_op', '_ipython_canary_method_should_not_exist_'}:
            super(BaseGeometry, self).__setattr__(key,value)
        else:
            self[key] = value
    def __setattribute__ (self, key, value):
        if key in {'_ao','_op', '_ipython_canary_method_should_not_exist_'}:
            super(BaseGeometry, self).__setattr__(key,value)
        else:
            self[key] = value
    def __setitem__(self, key, value):
        dict.__setitem__(self, key, value)
    def __getattribute__ (self, name):
        return super(BaseGeometry, self).__getattribute__(name)
    def __getattr__(self, name):
        try:
            if name in {'_ao','_ipython_canary_method_should_not_exist_'}:
                return super(BaseGeometry, self).__getattr__(k)
            return dict.__getitem__(self, name)
        except:
            raise AttributeError("'%s' object has no attribute '%s'" % (type(self).__name__, name))
    def __getitem__(self, k):
        return dict.__getitem__(self, k)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...