根据输入参数是否存在/不存在定义不同的类方法

问题描述 投票:0回答:1

我希望能够定义一种不同的类方法,具体取决于输入之一是否存在。比如:

class mcmc(object):
    def __init__(self, X, Y=None):
        if Y is None:
            def input_vector(self, beta):
                return beta.dot(X)
        else:
            def input_vector(self, beta):
                return beta.dot(np.vstack([X, Y]))

我可以直接在方法中编码,例如:

class mcmc(object):
    def __init__(self, X, Y=None):
        self.X = X
        if Y is not None:
            self.Y = Y

    def input_vector(self, beta):
        if self.__hasattr__('Y'):
            return return beta.dot(np.vstack([self.X, self.Y]))
        else:
            return beta.dot(self.X)

但是该函数被重复使用(数百万次),因此可能会增加很多执行时间。

另一种类似的可能性,受到如何根据同一个类中另一个方法的输入来调用类中的任何方法?,可能是:

class mcmc(object):
    def __init__(self, X, Y=None):
        self.X = X
        if Y is not None:
            self.Y = Y
            self.method = 'input_vector_XY'
        else:
            self.method = 'input_vector_X'

    def input_vector(self, beta):
        return self.__getattribute__(self.method)(beta)

    def input_vector_XY(self, beta):
        return return beta.dot(np.vstack([self.X, self.Y]))
    
    def input_vector_X(self, beta):
        return beta.dot(self.X)

这还涉及调用附加函数的“开销”。

python
1个回答
0
投票

无需在每个实例级别上执行此操作,您可以通过定义两个不同的类(可能具有公共基类)在类级别上执行此操作,并创建

mcmc
一个工厂函数,该函数返回一个或另一个类的实例:

def mcmc(X, Y=None):
    if Y is None:
        return MCMCWithoutY(X)
    else:
        return MCMCWithY(X, Y)

class MCMCWithoutY:
    def __init__(self, X):
        self.X = X

    def input_vector(self, beta):
        return beta.dot(self.X)

class MCMCWithY:
    def __init__(self, X, Y):
        self.X = X
        self.Y = Y

    def input_vector(self, beta):
        return beta.dot(np.vstack([self.X, self.Y]))
© www.soinside.com 2019 - 2024. All rights reserved.