2 回答
TA贡献1862条经验 获得超7个赞
您将所有属性作为普通值存储在实例的__dict__. 这意味着,如果没有任何进一步的提示,它们之间是无法区分的。
Python 有两种机制来以特殊方式处理属性。如果您将在类本身中声明基类中的属性,并在__init__方法中初始化它们的值,则可以内省基类' __dict__(而不是实例的__dict__)或__annotations__同一类中的属性。
但是,就像在示例中一样,一件简单的事情是使用特殊属性来记录添加到基类上的属性,然后将其作为属性的名称来源进行查询:
class baseclass(object):
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
self._numeric_attrs = set(kwargs.keys())
def calcValue(self):
return sum(getattr(self, attr) for attr in self._numeric_attrs)
TA贡献1853条经验 获得超18个赞
一个简单、安全和有效的——但增加了开销——将基类属性存储在一个不同的属性中并用于__getattr__为它们提供服务:
class BaseClass(object):
def __init__(self, **kwargs):
self._attribs = kwargs
def __getattr__(self, name):
try:
return self._attribs[name]
except KeyError:
raise AttributeError("object {} has no attribute {}".format(type(self).__name__, name))
def calcValue(self):
return sum(self._attribs.values())
我通常会尽量避免,__getattr__因为它会使代码更难检查和维护,但由于您的类已经没有明确的 API,因此在这里没有太大区别。
添加回答
举报