我正在尝试在一个类中创建一个类/静态方法。我需要SignInForm具有定义的实例变量,因为它们是由Django的模板呈现的。如何从实例变量调用类中的方法?我的目标是使用自定义窗口小部件更新每个变量,以创建一致的样式。
class SignInForm(forms.Form):
@classmethod
def get_text_input_with_attributes():
return forms.TextInput(attrs= {'class':'form-style'})
first_name = forms.CharField(max_length=50,required=True)
first_name.widget = SignInForm.get_text_input_with_attributes()
last_name = forms.CharField(max_length=50,error_messages={'required': ''})
last_name.widget = SignInForm.get_text_input_with_attributes()
....lots of other custom fields
错误:
名称'SignInForm'未定义
首先,简短的版本:
在定义该类的过程中,您不能调用类的方法(甚至是类方法和静态方法),至少不容易。
那么,什么可以做什么?好吧,实际上,您在这里不需要类方法或静态方法。您需要常规的旧功能。像这样:
class Spam(object):
def _func():
return 42
class_attr = _func()
del _func
定义了类之后,_func
将是一个实例方法和一个不可调用的实例方法,因为它不需要self
。(这就是为什么我给它加上下划线前缀,并且也del
将其命名为“ d”,以使以后更难以意外地调用它的原因……)
但是,虽然定义了它,但是它是一个正常的函数,可以这样调用。
我应该提一提,通常,这样做是一个标志,表明您的设计存在某些问题,而您尝试编写为类方法或静态方法的内容实际上应该是基类的方法,或者是自由函数或一个类的构造函数,甚至是一个元类方法。
正如大卫·桑德斯(David Sanders)的答案所解释的那样,您尝试做的特定事情很常见,以至于有一种惯用的编写方式:作为TextField
子类的类构造函数。
这是如何运作的?
显然,在执行Spam
类定义的过程中,没有任何调用Spam
,因此您绝对不能调用Spam._func
。
但是你为什么能打电话_func
?您必须了解如何执行类定义。稍微简化一点:Python创建一个空的全局字典,class
像定义脚本一样运行定义内的所有代码,然后返回真正的全局变量并运行Spam = type('Spam', (object,), that_global_dict)
。因此,当我们这样做时class_attr = _func()
,我们就位于该临时全局环境中,并且_func
是该环境中的一个函数,因此我们可以调用它。
那么,为什么我们不能使用aclassmethod
或staticmethod
?
一方面,您需要一个cls
对象来调用classmethod
,而我们没有一个。
另外,classmethod
和staticmethod
对象是不可调用的。函数对象本身可以调用,它们也是可用于构造绑定方法的描述符。类和静态方法是不可调用的,它们只是描述符,可用于以特殊方式构造绑定方法(绑定到类或不绑定任何东西,而不是实例)。
因此,如果您想编写可用作类定义时间函数以及以后用作静态方法的东西怎么办?最简单的方法是:
class Spam(object):
def _func():
return 42
smeth = staticmethod(_func)
class_attr = func()
del _func
@staticmethod
实际上,这样的装饰器确实可以做到_func = staticmethod(_func)
。我们可以做同样的事情,但是给结果取一个不同的名字,现在我们有了一个静态方法,同时仍然可以直接调用原始函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句