【问题标题】:Python structuring - Do I really need a class?Python 结构化 - 我真的需要一个类吗?
【发布时间】:2014-01-31 07:12:40
【问题描述】:

我有一个问题,解决方案似乎是创建一个类。但是,这个类中的所有方法都是静态的,我只会实例化一次类,所以我想知道使用类是否是正确的方法。

更具体地说,我希望有一个单独的模块来存储一些函数和一些变量,它们本质上是程序的骨架。这些函数和变量取决于定义我的模型的一些参数(并且我不想将这些参数作为参数传递,因为我可能会在以后指定相关的其他原因)。例如:

# my_model.py
def V(x):
   return -m*x**2 + k*x**4

在另一个模块上,我对这些参数“m”和“k”的一些值进行扫描,并且对于这些值中的每一个,我想找到 V 的最小值:

# scan.py
from scipy.optimize import minimize
import random, my_model

for i in range(5):
   m = random.randint(0,10)
   k = random.randint(0,10)
   minimize(my_model.V, 0)

当然,这是行不通的,因为 my_model.V 不知道 m 和 k 是什么。正如我所说,我考虑在 my_model 文件中创建一个类,在该类中定义函数 V(和其他!),并在 scan.py 中实例化该类,传递参数“m”,“k”作为参数。但是,正如我所说,这在我看来是对类特性的过度使用。例如,显然上面的函数 V 将是静态的,因此在此类中的所有其他定义中都会发生。那么有没有其他更合适的方法来实现我想要的,或者我只是“反应过度”和/或完全误解了 Python 中类的使用?

【问题讨论】:

  • 如果V 使用mk 成员,为什么它会是静态的?
  • @VaughnCato 因为我不需要也不想将self 传递给它。然后我可以创建一个class Model,在其中我将mk 定义为类(而非实例)变量。这对我来说确实有点奇怪,这就是为什么我不愿意来这里询问这是否是正确的做法......但它确实有效。

标签: python class project-structuring


【解决方案1】:

你可以使用functools.partial:

# my_model.py
def V(m, k, x):
   return -m*x**2 + k*x**4

并像这样使用它:

# scan.py
import functools
from scipy.optimize import minimize
import random, my_model

for i in range(5):
    m = random.randint(0,10)
    k = random.randint(0,10)
    minimize(functools.partial(my_model.V, m, k), 0)

这只是作为类的替代品。这里的口味不同,有人建议你真的应该这样做。使用一个类并为不同的模型函数设置@classmethods 对我来说也很好。

【讨论】:

  • 谢谢,这确实是解决这个问题的一种方法,它在我项目的其他地方也很有用!我必须承认我仍然不喜欢它的美学(必须将参数传递给 my_model.py 中的每个函数),这就是为什么我专注于寻找一种方法将它们传递一次(作为类参数)但我可以忍受它。
【解决方案2】:

我不确定我是否正确理解了您的问题,但我认为我会做的是:

1) 制作V的m和k参数

def V(x, m, k):
    return -m*x**2 + k*x**4

2) 当您想要最小化关于 x 的 V 时,对于固定的 m 和 k,创建一个已设置 m 和 k 的偏函数,并将其最小化:

from functools import partial

for i in range(5):
     m = random.randint(0, 10)
     k = random.randint(0, 10)
     V_with_fixed_m_k = partial(V, m=m, k=k)
     minimize(V_with_fixed_m_k, 0)

或者,创建一个函数,返回使用正确 m 和 k 的 V 版本:

def parameterized_V(m, k):
    def V(x):
        return -m*x**2 + k*x**4
    return V

但这基本上是对 functools.partial 的重新实现,仅适用于 V。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2020-01-29
    • 2011-01-28
    相关资源
    最近更新 更多