Py学习  »  Python

基类中非继承属性上的python循环

Torilla • 5 年前 • 1311 次点击  

我有一个基类,它包含一些商业属性,这些属性在初始化时作为字典传递给它,然后添加到实例的字典中:

class baseclass(object):
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

    def calcValue(self):
        return sum(vars(self).values())

现在我有一个从这个类派生的类,它向这个类添加了额外的属性,例如;

class childclass(baseclass):
    def __init__(self, stringValue, **kwargs):
        super(childclass, self).__init__(kwargs)
        self.name = stringValue

现在,我希望基类中有一个函数,它只遍历添加到类中的所有属性,而不是作为子属性添加的属性。例如,如果创建子类的实例,如下所示:

instance = childclass("myname", a=1, b=2, c=3)

然后调用calcvalue方法,它应该返回1+2+3=6

instance.calcValue()

但是由于vars(self)将返回完整的字典,因此从childClass属性中去掉字符串,当然不能添加。有没有办法只访问属于各自派生类的实例的属性?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40915
 
1311 次点击  
文章 [ 2 ]  |  最新文章 5 年前
bruno desthuilliers
Reply   •   1 楼
bruno desthuilliers    5 年前

一个简单、安全和有效的方法是将基类属性存储在一个不同的属性中并使用 __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())

我通常尽量避免 阿-格二氏 因为它使代码更难检查和维护,但是由于您的类已经没有明确的api,所以在这里没有太大区别。

jsbueno
Reply   •   2 楼
jsbueno    5 年前

您将所有属性作为普通值存储在实例的 __dict__ . 也就是说,没有任何进一步的暗示,它们就无法区分。

python有两种机制以特殊方式处理属性。如果要在类本身的基类中声明属性,并在 __init__ 方法,则可以内省基类 第二节 (而不是实例的 第二节 ) __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)