【发布时间】: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和_op是 class 属性。当您执行b1._ao = 1时,您正在创建一个instance 属性。所以我不清楚你想要的结果是什么。它们应该是类属性还是实例属性?
标签: python oop dictionary inheritance