我目前正在实现一个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
的方法被覆盖......
答案 0 :(得分:2)
一般来说,
class Meta(object):
sort_key= staticmethod(lambda e: e)
我不知道Django在移植'meta'成员方面做的任何魔法都可以用这样的装饰方法来应对,但我没有看到任何固有的原因。
答案 1 :(得分:2)
您为什么要将sort_key
放入Meta
? Meta
用于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
,无论你需要它......