Python:如何防止将作为函数的类变量理解为方法?
我目前正在实现一个django应用程序,为此我尝试使用与django一致的语法 下面是我正在尝试的:Python:如何防止将作为函数的类变量理解为方法?,python,django,function,methods,metaclass,Python,Django,Function,Methods,Metaclass,我目前正在实现一个django应用程序,为此我尝试使用与django一致的语法 下面是我正在尝试的: class Blablabla(Model): #this contains Blablabla's options class Meta: sort_key = lambda e: e sort\u key是一个键函数(用于排序),但当然,它被理解为Meta的方法(这绝对不是我想要的) 有没有解决办法,仍然允许我使用这种语法 编辑: 只是一个重要的精确度。。
class Blablabla(Model):
#this contains Blablabla's options
class Meta:
sort_key = lambda e: e
sort\u key
是一个键函数(用于排序),但当然,它被理解为Meta
的方法(这绝对不是我想要的)
有没有解决办法,仍然允许我使用这种语法
编辑:
只是一个重要的精确度。。。我写的代码应该是由使用库的人写的!这就是为什么我不想要任何肮脏的把戏。是的,在Django,它实际上只是用于选项。。。当然,Meta是一个类,但我说“它不被视为一个类”,因为它不被用作一个类:你不实例化它,你不放类方法,只放类属性。。。模型
有一个元类,它从这个元
中提取所有内容,并处理所有声明的选项。。。但仅此而已!它只是选项的占位符
但好吧,这是真的,我从来没有看到一个选项是Django中的函数。。。因此,我将遵循Ned声明此排序函数作为Model
的一种方法,它通常必须被覆盖…
class Meta(object):
sort_key= staticmethod(lambda e: e)
我不知道Django为移植“meta”成员所做的任何魔术是否可以处理像这样的修饰方法,但我看不出有任何内在的原因
class Meta(object):
sort_key= staticmethod(lambda e: e)
我不知道Django为移植“meta”成员所做的任何魔术是否可以处理像这样的修饰方法,但我看不出有什么内在的原因不可以。OP在评论中写道“meta”实际上不应该被视为一个类”。如果是这样的话,也就是说,如果Django在
Meta
确实是而不是一个类(一个非常大的“If”)的情况下能够生存下来,那么就有可能满足OP真正奇怪的愿望,避免最简单的解决方案(只需围绕所讨论的lambda
包装stqticfunction
)
本质上,这需要编写一个(非常奇怪的)meta-类来生成一个对象,其中属性查找绕过了类对描述符对象的正常使用(每个函数都是:也就是说,它有一个\uuuu get\uuuu
方法,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
成为一个类的东西都会被破坏(但是,你确实会说它“不应该被视为一个类”,所以这基本上就是你想要的:破坏任何认为它是被视为一个类的代码)!-。OP在评论中写道“‘Meta’并不是真正应该被视为一个类”。如果是这样的话,也就是说,如果Django能够在Meta
确实不是一个类(一个非常大的“If”)的情况下生存下来,那么就有可能满足OP真正奇怪的愿望,避免最简单的解决方案(只需将stqticfunction
包装在所讨论的lambda
周围即可)
本质上,这需要编写一个(非常奇怪的)meta-类来生成一个对象,其中属性查找绕过了类对描述符对象的正常使用(每个函数都是:也就是说,它有一个\uuuu get\uuuu
方法,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
成为一个类的东西都会被破坏(但是,你确实会说它“不应该被视为一个类”,所以这基本上就是你想要的:破坏任何认为它是被视为一个类的代码!).为什么要将排序键
放入Meta
?Meta
用于Django选项,它不是放置您自己的方法的地方。模型可以在其上定义方法。我想您想要的是以下简单的东西:
class Blablabla(Model):
def sort_key(self, e):
return e
你为什么要把
sort\u key
放入Meta
?Meta
用于Django选项,它不是一个放置你自己方法的地方。模型上可以定义方法。我想你想要的东西很简单:
class Blablabla(Model):
def sort_key(self, e):
return e
你不能创建一个简单的模块(
meta
?)并将sort\u key
添加到其中吗?然后继续将它包含在你需要的任何地方…你不能创建一个简单的模块(meta
?)然后在它上面添加sort\u key
?然后继续并在你需要的地方包含它…检查你的断言。这对你来说可能是一个很好的读物:如果你这样定义它,sort\u key将成为Meta的一个绑定方法。如果这不是你想要的,我的问题是:你想实现什么?如果你知道Django,“Meta”“只是一个人工制品,它允许将选项声明与字段声明分开(因为字段可以有任何名称)!例如:类MyModel(模型):a_field=TextField()另一个_field=TextField()类Meta:an_option=1另一个_option=“blablabla”等等……你明白为什么这有用吗?@user166390:我正在研究你的东西,但在我的情况下,这似乎不起作用……它仍在等待一个Meta实例作为第一个参数……不知道为什么要检查你的断言。这可能对你来说是一个很好的读物:如果你这样定义它,sort\u key将成为Meta的一个绑定方法。如果是这样的话这不是你想要的,我的问题是:你想实现什么?如果你知道Django,“Meta”只是一个人工制品,它允许将选项声明与字段声明分开(因为字段可以有任何名称)!例如:类MyModel(Model):a_field=TextField()另一个_field=TextField()类元:一个选项