调用类/静态方法并分配给实例变量

富有的

我正在尝试在一个类中创建一个类/静态方法。我需要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是该环境中的一个函数,因此我们可以调用它。

那么,为什么我们不能使用aclassmethodstaticmethod

一方面,您需要一个cls对象来调用classmethod,而我们没有一个。

另外,classmethodstaticmethod对象是不可调用的。函数对象本身可以调用,它们也是可用于构造绑定方法的描述符类和静态方法是不可调用的,它们只是描述符,可用于以特殊方式构造绑定方法(绑定到类或不绑定任何东西,而不是实例)。


因此,如果您想编写可用作类定义时间函数以及以后用作静态方法的东西怎么办?最简单的方法是:

class Spam(object):
    def _func():
        return 42
    smeth = staticmethod(_func)

    class_attr = func()

    del _func

@staticmethod实际上,这样的装饰器确实可以做到_func = staticmethod(_func)我们可以做同样的事情,但是给结果取一个不同的名字,现在我们有了一个静态方法,同时仍然可以直接调用原始函数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将静态变量的值分配给类变量

来自分类Dev

在对象的新实例上调用方法而不将其分配给变量

来自分类Dev

调用分配给预更新挂钩中的变量的方法

来自分类Dev

Asynctask onPostExecutive方法将值分配给实例变量,但在mainActivity类中未显示该值。

来自分类Dev

在不将实例分配给变量的情况下实例化python类是否可以?

来自分类Dev

将函数调用分配给变量

来自分类Dev

将派生类的实例分配给基类的变量

来自分类Dev

您可以将变量分配给静态类指针吗?

来自分类Dev

将静态constexpr类成员分配给运行时变量

来自分类Dev

如果变量是静态的,如何将其分配给类构造函数?

来自分类Dev

您可以将变量分配给静态类指针吗?

来自分类Dev

没有分配给变量的类实例是否会过早地被垃圾回收?

来自分类Dev

Swift:将泛型类型的实例分配给类变量?

来自分类Dev

N次创建一个类的实例,而不将其分配给变量

来自分类Dev

未分配给变量的类实例是否会过早地被垃圾回收?

来自分类Dev

将条件值分配给静态类的类成员

来自分类Dev

将Swift方法分配给变量

来自分类Dev

(为什么)我们可以在初始化时将非静态类成员分配给静态变量?

来自分类Dev

为什么没有将静态变量分配给static方法返回的值?

来自分类Dev

接口类型不能静态分配给具有两个变量的方法

来自分类Dev

调用静态方法,并将类名称存储为实例变量

来自分类Dev

如何直接通过方法而不是通过实例将值分配给变量

来自分类Dev

如何将类方法分配给默认属性(即从静态范围引用非静态方法)

来自分类Dev

无法将类实例分配给其协议类型?

来自分类Dev

类实例不能分配给继承的接口

来自分类Dev

将渲染的部分分配给实例变量

来自分类Dev

将实例字段分配给局部变量

来自分类Dev

何时创建分配给实例变量的对象

来自分类Dev

Mule:如何将Java / Spring bean的方法调用结果分配给流变量

Related 相关文章

  1. 1

    将静态变量的值分配给类变量

  2. 2

    在对象的新实例上调用方法而不将其分配给变量

  3. 3

    调用分配给预更新挂钩中的变量的方法

  4. 4

    Asynctask onPostExecutive方法将值分配给实例变量,但在mainActivity类中未显示该值。

  5. 5

    在不将实例分配给变量的情况下实例化python类是否可以?

  6. 6

    将函数调用分配给变量

  7. 7

    将派生类的实例分配给基类的变量

  8. 8

    您可以将变量分配给静态类指针吗?

  9. 9

    将静态constexpr类成员分配给运行时变量

  10. 10

    如果变量是静态的,如何将其分配给类构造函数?

  11. 11

    您可以将变量分配给静态类指针吗?

  12. 12

    没有分配给变量的类实例是否会过早地被垃圾回收?

  13. 13

    Swift:将泛型类型的实例分配给类变量?

  14. 14

    N次创建一个类的实例,而不将其分配给变量

  15. 15

    未分配给变量的类实例是否会过早地被垃圾回收?

  16. 16

    将条件值分配给静态类的类成员

  17. 17

    将Swift方法分配给变量

  18. 18

    (为什么)我们可以在初始化时将非静态类成员分配给静态变量?

  19. 19

    为什么没有将静态变量分配给static方法返回的值?

  20. 20

    接口类型不能静态分配给具有两个变量的方法

  21. 21

    调用静态方法,并将类名称存储为实例变量

  22. 22

    如何直接通过方法而不是通过实例将值分配给变量

  23. 23

    如何将类方法分配给默认属性(即从静态范围引用非静态方法)

  24. 24

    无法将类实例分配给其协议类型?

  25. 25

    类实例不能分配给继承的接口

  26. 26

    将渲染的部分分配给实例变量

  27. 27

    将实例字段分配给局部变量

  28. 28

    何时创建分配给实例变量的对象

  29. 29

    Mule:如何将Java / Spring bean的方法调用结果分配给流变量

热门标签

归档