代码之家  ›  专栏  ›  技术社区  ›  sebpiq

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

  •  0
  • sebpiq  · 技术社区  · 14 年前

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

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

    sort_key 是一个关键函数(用于排序),但当然,它被理解为 Meta

    对此有什么解决方法,仍然允许我使用这种语法吗?

    编辑: 只是一个重要的精确性。。。我写的代码应该是使用库的人写的!这就是为什么我不想要任何肮脏的把戏。是的,在Django它真的只是用来做选择。。。当然,Meta是一个类,但我说“它不被看作类”,因为它不被用作类:你不实例化它,你不放类方法,只有类属性。。。这个 Model 并处理所有声明的选项。。。但仅此而已!它只是选项的占位符。

    但这是真的,我从来没有看到一个选项,是在Django函数。。。所以我跟着你 将此排序函数声明为

    4 回复  |  直到 14 年前
        1
  •  2
  •   Ned Batchelder    14 年前

    你为什么要把 sort_key 进入之内 Meta

    class Blablabla(Model):
    
        def sort_key(self, e):
            return e
    
        2
  •  2
  •   bobince    14 年前

    一般来说,

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

        3
  •  0
  •   Alex Martelli    14 年前

    OP在评论中写道:“Meta不应该被看作是一个类”。如果是这样的话,也就是说,如果Django在 Meta 确实是 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 “被视为一个阶级”!-).

        4
  •  0
  •   Daren Thomas    14 年前

    你不能创建一个简单的模块吗( meta sort_key 对吗?那就继续 include