使用python模块作为对象

时间:2014-04-25 11:23:26

标签: python class module physics

我在python中创建了一个工作模拟,其编写如下:

alpha = 5

def f(x):
    """
    Returns value from function
    """
    return alpha*x**2

def g(x):
    """
    Returns another value
    """
    return f(10)*alpha + 4 

它的问题是,每次我有其他alpha我必须编辑文件。为了避免这种情况,我试图使用类,编辑的代码是:

class Myclass():

    def __init__(self,alpha):
        """
        Asign alpha for class instance
        """
        self.alpha = alpha

    def f(self,x):
        """
        Returns value from function
        """
        alpha = self.alpha

        return alpha*x**2

    def g(self,x):
        """
        Returns another value
        """
        alpha = self.alpha
        f =  self.f

        return f(10)*alpha + 4 

可以用作:

inst = Myclass(4)
inst.g(5) # Getting the function value
inst.f(5) # Also testing of used functions is needed

期望的行为是什么。

问题在于我必须以下列方式编辑我的工作模拟代码:

  • 对于 Myclass 下的每个功能,我需要写一些额外的参数 self
  • 还需要从Myclass对象分配局部变量的值

如何避免这些编辑?也许有一些装饰师可以做我想要达到的目标?

修改

在这种情况下,额外的关键字参数并不方便,因为我需要从函数到函数跟踪这些参数。通常它可以将代码嵌套在另一个函数中,但在这个时候我明确需要速度和测试。

编辑2

我几乎得到了我希望如何使用我的工作模拟的行为。经过长时间在谷歌搜索后,我记得在py Classes中以某种方式介绍了Modules。因此我想用它作为某种对象。

首先,我将我的模拟单独留在一个名为mymodule.py的文件中,我将其用作另一个文件中的模块:

class Myclass():    

    def __init__(self,alpha):
        """
        Asign alpha for class instance
        """
        import mymodule
        mymodule.alpha = alpha        
        self.f = mymodule.f
        self.g = mymodule.g

与给定的例子一起使用。然而,它引发了一种不受欢迎的行为:

inst = Myclass(5)
inst.g(5)
# 2504
inst_another = Myclass(6)
inst.g(5)
# 3604

或仅仅Class实例不是独立的。有办法解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

alpha作为参数传递给两个函数。在这种情况下,我给alpha一个默认值5,但这不是必需的。如果需要,您可以使用x, alpha定义这两个函数。

def f(x, alpha=5):
    """
    Returns value from function
    """
    return alpha*x**2

def g(x, alpha=5):
    """
    Returns another value
    """
    return f(10)*alpha + 4 

使用默认alpha值5的示例:

>>> g(5)
2504

>>> f(5)
125

另一个地方,g()的alpha为2,f()为1:

>>> g(5, alpha=2)
1004

>>> f(5, 1)
25

如果你有很多alphas

>>> alpha_list = [7, 11, 13, 2, 1, 3, 5, 14, 4, 0, 6, 10, 9, 12, 8]
>>> [(f(5, x), g(5, x)) for x in alpha_list] 
[(175, 3504),
 (275, 5504),
 (325, 6504),
 (50, 1004),
 (25, 504),
 (75, 1504),
 (125, 2504),
 (350, 7004),
 (100, 2004),
 (0, 4),
 (150, 3004),
 (250, 5004),
 (225, 4504),
 (300, 6004),
 (200, 4004)]

答案 1 :(得分:0)

如果它有帮助,你就不必为#c;从Myclass对象分配局部变量的值"

class Myclass():

    def __init__(self,alpha):
        self.alpha = alpha

    def f(self,x):
        return self.alpha*x**2

    def g(self,x):
        return self.f(10)*self.alpha + 4 

答案 2 :(得分:0)

您可能拥有将两个参数都作为参数

的函数
def realf(x, alpha):
    """
    Returns value from function
    """
    return alpha*x**2

然后你可以设置默认alpha,这样它就像一个带有一个参数的函数。

f5 = functools.partial(realf, alpha = 5)
...
f7 = functools.partial(realf, alpha = 7)