【问题标题】:Inherit from Dict with Private Values on Object使用对象上的私有值从 Dict 继承
【发布时间】:2018-10-22 17:28:47
【问题描述】:

编辑 - 我想通了

所以我有如下定义的类:

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 出现在对象的字典中。

【问题讨论】:

  • 现在,您的 _ao_opclass 属性。当您执行b1._ao = 1 时,您正在创建一个instance 属性。所以我不清楚你想要的结果是什么。它们应该是类属性还是实例属性?

标签: python oop dictionary inheritance


【解决方案1】:

**解决方案:**

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)

【讨论】:

    猜你喜欢
    • 2020-10-25
    • 2013-09-06
    • 1970-01-01
    • 2018-05-11
    • 2012-07-03
    • 2019-09-03
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多