Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何防止将作为函数的类变量理解为方法?_Python_Django_Function_Methods_Metaclass - Fatal编程技术网

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

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的方法(这绝对不是我想要的) 有没有解决办法,仍然允许我使用这种语法 编辑: 只是一个重要的精确度。。

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

下面是我正在尝试的:

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()类元:一个选项