在Obj上使用私有值从Dict继承

2024-03-28 15:08:26 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑-我想出来了

所以我有一个定义如下的类:

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.\u ao=(1,0)并打印BaseLocation对象,我会在字典中看到_ao,这是我永远不想看到的。那么我需要做什么来隐藏这个变量呢?你知道吗

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

您将看到_ao出现在对象的dict中。你知道吗


Tags: keynameselfnonereturnifvaluedef
1条回答
网友
1楼 · 发布于 2024-03-28 15:08:26

**解决方案:**

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)

相关问题 更多 >