Python:如何防止作为函数的类变量被理解为方法?

时间:2010-09-16 23:27:06

标签: python django function methods metaclass

我目前正在实现一个django应用程序,为此我尝试使用与Django一致的语法......

所以我正在尝试这里:

class Blablabla(Model):

    #this contains Blablabla's options
    class Meta:
        sort_key = lambda e: e

sort_key是一个关键功能(用于排序目的),但当然,它被理解为Meta的方法(这绝对不是我想要的)!!!

对此的任何解决方法,仍然允许我使用此语法?

编辑: 只是一个重要的精度...我写的代码应该是由使用该库的人编写的!这就是为什么我不想要任何肮脏的伎俩。在Django中它是真的只用于选项...当然Meta是一个类,但我说“它不被视为一个类”,因为它不是用作类:你没有实例化它,你没有把类方法,只有类属性... Model有一个元类,它从这个Meta中提取所有内容并处理所有声明的选项......但这就是全部!它只是选项的占位符。

但是没错,我从来没有看到Django中的一个函数选项...所以我将按照 Ned 声明这个排序函数作为Model的方法被覆盖......

4 个答案:

答案 0 :(得分:2)

一般来说,

class Meta(object):
    sort_key= staticmethod(lambda e: e)

我不知道Django在移植'meta'成员方面做的任何魔法都可以用这样的装饰方法来应对,但我没有看到任何固有的原因。

答案 1 :(得分:2)

您为什么要将sort_key放入MetaMeta用于Django选项,它不是放置自己的方法的地方。模型可以在其上定义方法。我想你想要的东西很简单:

class Blablabla(Model):

    def sort_key(self, e):
        return e

答案 2 :(得分:0)

OP在评论中写道“'Meta'并不应该被视为一个类”。如果是这样的话,也就是说,如果当Meta确实一个类(一个非常大的“if”)时,Django可以存活,那么就有可能满足OP真正奇怪的愿望。避免使用最简单的解决方案(只需在stqticfunction周围包裹lambda。)

本质上,这需要编写一个(非常奇怪的) - 类来生成一个对象,其中属性查找绕过了类对描述符对象的正常使用(每个函数都是descriptor object:是的,它有一个__get__方法,Python通常在查找类或其实例上的属性时使用。)

这种荒谬的旋转的一般想法就像......:

class MetaNotAClass(type):
   def __new__(mcl, clasname, bases, clasdict):
     if bases:
         usedict = {}
     else:
         usedict = clasdict
     usedict['__foo'] = clasdict
     return type.__new__(mcl, clasname, bases, usedict)
   def __getattr__(cls, atname):
      try: return getattr(cls, '__foo')[atname]
      except KeyError: raise AttributeError, atname

class NotAClass:
  __metaclass__ = MetaNotAClass


class Bah(NotAClass):
  def f(): return 'weird!'

print Bah.f()

当然,任何期望 Bah 一个类的东西都会破坏(但是,你确实说它“不应该被视为一个类“,这基本上就是你所要求的:打破任何认为 ”的代码被视为一个类“! - ”。

答案 3 :(得分:0)

你不能只创建一个简单的模块(meta?)并添加sort_key吗?然后继续include,无论你需要它......