访问另一个实例的损坏成员

2024-07-04 08:20:54 发布

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

我使用此逻辑来维护Object实例的定向树:

class Object:
    def __init__(self, *parents: 'Object'):
        self.__parents = list(parents)

    @property
    def __ascendants(self):
        for parent in self.__parents:
            yield from parent.__ascendants
            yield parent

这段代码运行良好,但PyLint抱怨__ascendantsparent的受保护成员,对PyLint来说,这是一个客户机类。在

对于一个受保护的、未损坏的成员,这是很好的:我不应该访问这样的成员,因为它们可能被Object子类覆盖。在

但是在这种情况下,由于属性被损坏,子类不可能覆盖它们,这就是为什么我允许自己甚至在外部对象(提供给构造函数)上使用它们。在

TLDR;我正在寻找一种方法,使PyLint接受访问客户机子类的损坏属性,而不必每次都求助于#pylint: disable=protected-access,或者全局禁用警告。在

看起来我可以使用astng回调来注册一个MANAGER,并转换一个模块,以便PyLint可以使用其他信息。但是,我只能添加存根成员(这样动态添加的成员就可以在没有警告的情况下使用),而且我不确定是否可以用这种方式解决问题。在

我还试图添加assert isinstance(parent, Object),但这没用。在

编辑

我能够编写代码,这样PyLInt就不会引发protected-access,而只会引发bad-staticmethod-argument。我不在这个特定的类中使用其他staticmethod,所以这可能是这个问题的一个可接受的答案:

^{pr2}$

编辑2:(灵感来自@shx2)

使用具有正确参数名称的lambda也会愚弄Pylint:

class Object:
    def __init__(self, *parents: 'Object'):
        self.__parents = list(parents)

    @property
    def __ascendants(self):
        get_ascendants = lambda self: self.__ascendants

        for parent in self.__parents:
            yield from get_ascendants(parent)
            yield parent

编辑3:由于名称不会从生成器表达式(或列表综合)中泄漏,因此也可以这样写:

from itertools import chain

class Object:
    def __init__(self, *parents: 'Object'):
        self.__parents = list(parents)

    @property
    def __ascendants(self):
        return chain(*(
           chain(self.__ascendants, (self, ))
           for self in self.__parents
        ))

Tags: inselfforobjectinitdef成员property
2条回答

为什么要使ascendants方法成为损坏的属性?如果您真的想使用这样一个复杂的继承并为每个超类保留多个parents属性,那么对parents进行损坏就可以了。{1>似乎不属于这个类,因为它不属于这个类:

class Object(object):
    def __init__(self, parents):
        self.__parents = list(parents)

    def ascendants(self):
        for parent in self.__parents:
            yield from parent.ascendants()
            yield parent

I'm looking for a way to make PyLint accept accessing mangled attributes of a client subclass

有办法愚弄皮林。在

一种方法是将parent伪装成self

@property
def __ascendants(self):
    for parent in self.__parents:
        self = parent
        yield from self.__ascendants
        yield self

另一种方法是使用getattr间接访问属性。而不是:

^{pr2}$

执行:

yield from getattr(parent, '__ascendants')

相关问题 更多 >

    热门问题