【问题标题】:Dynamic runtime method in PythonPython中的动态运行时方法
【发布时间】:2012-04-30 08:09:59
【问题描述】:
class Screening(models.Model):
  def get_omitted_1(self):
       return OmittedInformationReason.objects.get(pk=self.omitted_1).name 
  get_omitted_1 = property(get_omitted_1)

我想访问screening_instance.get_omitted_1、screening_instance.get_omitted_2 到screening_instance.get_omitted_10。有没有更好的方法来做到这一点,而无需为每个案例创建 get_omitted_1、get_omitted_2.. 方法,如 get_omitted_%d ??

我尝试在运行时创建动态函数,但遇到了一些问题。我尝试过这样的事情:

def omitted_list(self,x):
    def omitted_function(self): 
        opk = "omitted_%d" % x
        return OmittedInformationReason.objects.get(pk=self.opk).name

    omitted_name = 'get_omitted_'+ str(x)

    setattr(self.__class__, omitted_name , omitted_function)
    omitted_name = property(omitted_name)

    for x in range(1, 3): 
      omitted_list(x)

【问题讨论】:

  • 我不知道你为什么相信代码会起作用......
  • 或者你为什么认为这是一个好主意。
  • 我得到 AttributeError: 'Screening' object has no attribute 'get_omitted_1' with this code

标签: python django dynamic-method


【解决方案1】:

我看不出有任何可能的需要。如果您需要动态访问项目,请使用一种方法:这就是它们的用途。

def get_omitted(self, number):
    return OmittedInformationReason.objects.get(pk=number)

【讨论】:

  • 通过创建这样的方法,我将无法在 django 视图中使用它来进行筛选.get_omitted.1 因此,动态方法使我能够在视图中使用作为筛选.get_omitted_1
【解决方案2】:

通过创建这样的方法,我将无法在 django 视图中使用它 对于screening.get_omited.1 所以,动态方法使我能够使用 查看为screening.get_omitted_1

啊哈!您应该在原始问题中提到这一点。如果您有其他人会将您定向到documentation for creating custom tags,这是解决您问题的正确方法。

创建标签后,您可以在模板中执行{% get_omitted 1 %} 然后{% get_omitted 2 %} 等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多