Python:如何编写所有需要相同条件的方法

Python:如何编写所有需要相同条件的方法,python,Python,我有一个类,它的许多方法取决于类的另一个特定实例的可能存在,但不确定是否存在。这些方法的条件是:如果其他实例返回X,否则返回None。事实上,我为每个方法编写了几个相同的if语句作为代码的一部分。(还请注意,由于继承问题,我不能使用自定义的\uuuu init\uuuu)除了None之外,是否有一种实用的或适当的方法来限制这种冗余编码,如我下面所示(在一个大大简化的模型上) 你可以用一个定制的装饰 def dependent(meth): def depmeth(self, *args,

我有一个
,它的许多方法取决于
的另一个特定实例的可能存在,但不确定是否存在。这些方法的条件是:
如果其他实例返回X,否则返回None
。事实上,我为每个方法编写了几个相同的
if
语句作为代码的一部分。(还请注意,由于继承问题,我不能使用自定义的
\uuuu init\uuuu
)除了
None
之外,是否有一种实用的或适当的方法来限制这种冗余编码,如我下面所示(在一个大大简化的模型上)


你可以用一个定制的装饰

def dependent(meth):
    def depmeth(self, *args, **kwargs):
        if self.other_instance:
            return meth(self, *args, **kwargs)
        else:
            return None
    return depmeth
那么你的班级就会变成

class ...:
    ...
    def meth1(self, x):
        return "always working"

    @dependent
    def meth2(self, y):
        return "code executed only if other_instance is present"

这些条件中的哪一个是冗余的?任何依赖于
self.prior
的条件都是冗余的。我清理了我的代码以更好地显示这一点。请重新阅读您的代码-没有与您的描述相匹配的条件…正确,因为如果条件存在,这些方法将由
获取之前的季度
导出。对于我的问题,这似乎是一个危险的解决方案。我当然想到了这一点,而且可能过于忽视了装饰师。在这种情况下,与将方法重新定义为值为
None
的属性的更绝对的方法相比,您是否考虑过装饰器的价值。将方法归零是不可逆的。属性(显然是对象
previor
)是否可以在类的生命周期中稍后定义?您的代码将来是否可以扩展以实现这一点?如果是这样,您将遇到一个难以解决的设计问题。在所有依赖函数中不都重复未定义代码吗?我会让函数保持不变,要么咬住它并检查
previor
,要么让它引发错误并捕捉到更高的值——无论如何,你需要处理
None
。谢谢你周到的回复。我学到了另一件事:
@property
消除了使用
setattr(self,'method\u name')
的能力。你的代码工作得很好。仅供参考,您可以使用一行
返回self.previous_quarth和mthd(self,*args,**kwargs)或None来编写depmeth。科尔:请注意,在Python中,许多设计思想之一是,简化代码阅读比简化代码编写更为重要(代码编写一次,但在程序生命周期中多次读取)。如果您的目标是保存击键,并且准备牺牲其可读性,那么PERL(基本上是一种只写语言)可能是一个更好的选择。还要注意,Python现在有一个三元运算符
x1 if test else x2
:and/or技巧已经过时了(如果meth返回一个非None-None-falsy的结果,比如0,那么实现它的方式可能会有问题)。@6502您对
test和x或y
提出了一些很好的观点,而不是
x if test else y
(尽管我不再使用单行
if/else
语句)。
class ...:
    ...
    def meth1(self, x):
        return "always working"

    @dependent
    def meth2(self, y):
        return "code executed only if other_instance is present"