我怎样才能正确实现这个使用类的例子?

时间:2017-03-23 13:15:46

标签: python-3.x class dictionary chaining kwargs

在下面的示例中,可以选择常量来依赖未来情境的上下文。

class Constants:
    SPEEDLIGHT = 3 * 10**8
    GRAVITY = 9.81

C = Constants()
print(C.GRAVITY)
>> 9.81

这并不太难,因为每个数量都是固定常数。但是假设我想为功能做类似的事情。在下面的第一个代码块中,我指定了两个可积变量x和固定参数ab的分布。

class IntegrableDistribution:
    def Gaussian(x,a,b):
        cnorm = 1 / ( b * (2 * pi)**(1/2) )
        return cnorm * np.exp( (-1) * (x-a)**2 / (2 * b**2) )
    # Gaussian = Gaussian(x,a,b)

    def Lognormal(x,a,b):
        cnorm = 1 / ( b * (2 * pi)**(1/2) )
        return cnorm * exp( (-1) * (np.log(x)-a)**2 / (2 * b**2) ) / x
    # Lognormal = Lognormal(x,a,b)

我试图命名这些发行版,以便它们可以调用。这导致了错误消息,因此上面注释掉了代码。在下一个代码块中,我尝试使用输入来选择集成的分布(虽然我觉得效率非常低)。

Integrable = IntegrableDistribution()

class CallIntegrableDistribution:

    def Model():

        def Pick():
            """
            1 :   Gaussian Distribution
            2 :   Lognormal Distribution
            """
            self.cmnd = cmnd
            cmnd = int(input("Pick a Distribution Model:    "))
            return cmnd

        self.cmnd = cmnd

        if cmnd == 1:
            Distribution = Integrable.Gaussian
        if cmnd == 2:
            Distribution = Integrable.Lognormal

        return Distribution

OR ALTERNATIVELY

    cmnd = {
        1: Gaussian,
        2: Lognormal,
    }

我并不真正关心发行问题;我只是用它来展示我的知识和未知数。有什么方法可以正确地使用类或字典来做到这一点或更类似/更简单?

1 个答案:

答案 0 :(得分:2)

使用static methods

class IntegrableDistribution:
    @staticmethod
    def Gaussian(x,a,b):
        cnorm = 1 / ( b * (2 * pi)**(1/2) )
        return cnorm * np.exp( (-1) * (x-a)**2 / (2 * b**2) )

    @staticmethod
    def Lognormal(x,a,b):
        cnorm = 1 / ( b * (2 * pi)**(1/2) )
        return cnorm * exp( (-1) * (np.log(x)-a)**2 / (2 * b**2) ) / x

用法:

some_result = IntegrableDistribution.Gaussian(1, 2, 3)
another_result = IntegrableDistribution.Lognormal(1, 2, 3)