社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Torilla • 5 年前 • 1597 次点击  

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

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
 
1597 次点击  
文章 [ 2 ]  |  最新文章 5 年前
bruno desthuilliers
Reply   •   1 楼
bruno desthuilliers    6 年前

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

您将所有属性作为普通值存储在实例的 __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)