【问题标题】:Overriding a function in python覆盖python中的函数
【发布时间】:2012-02-24 18:56:08
【问题描述】:

我有以下基类(代码缩短):

class SignupForm(GroupForm):

    username = forms.CharField(
        label = _("Username"),
        max_length = 30,
        widget = forms.TextInput()
    )

    def __init__(self, *args, **kwargs):
        super(SignupForm, self).__init__(*args, **kwargs)
        if REQUIRED_EMAIL or EMAIL_VERIFICATION or EMAIL_AUTHENTICATION:
            self.fields["email"].label = ugettext("Email")
            self.fields["email"].required = True
        else:
            self.fields["email"].label = ugettext("Email (optional)")
            self.fields["email"].required = False


    def after_signup(self, user, **kwargs):
        """
        An extension point for subclasses.
        """
        pass

我想做的是像这样覆盖after_signup() 函数和username 字段:

class CompanySignupForm(SignupForm):
    #TODO: override fields for company signup form

    username = forms.CharField(
        label = _("Username TEST"),
        max_length = 30,
        widget = forms.TextInput()
    )

    def after_signup(self, user, **kwargs):
        """
        An extension point for subclasses.
        """
        print str('after_signup is has been overwritten')

我的问题: 只有用户名字段显示所需的行为。 after_signup() 函数永远不会被调用。而是调用基类SignupFormafter_signup() 函数。我做错了什么?

编辑:

the imports: 
from django import forms 
from django.contrib.auth.models import User 
from django.utils.translation import ugettext_lazy as _, ugettext

实例化 CompanySignupForm:

url(r"^signup/$", CompanySignupForm.as_view(), name="acct_signup")

after_signup() 正在从基类中的函数调用:

def save(self, request=None): 
    # more code here
    # ...
    self.after_signup(new_user)

【问题讨论】:

  • 您能告诉我们您是如何实例化CompanySignupForm 并调用after_signup() 的吗?
  • 导入很好,我没有错误。但在这里它们是:从 django 导入表单从 django.contrib.auth.models 导入用户从 django.utils.translation 导入 ugettext_lazy as _, ugettext
  • 实例化 CompanySignupForm: url(r"^signup/$", CompanySignupForm.as_view(), name="acct_signup")
  • after_signup() 正在从基类中的函数调用:def save(self, request=None): self.after_signup(new_user)
  • @JoheGreen:您可以edit您的问题并在此处添加此信息。带有代码的注释很难理解。

标签: python inheritance overriding superclass


【解决方案1】:

使用isinstance() 检查实例的类型,使用.__class__ 确保您正在实例化CompanySignupForm

您可能还想在CompanySignupForm 上创建一个__init__ 方法,以确保它不只是实例化超类。

注意:更仔细地阅读您的编辑,您不直接调用 after_signup 基类函数 save 对吗?如果存在,这将调用它的本地方法 after_signup。我会将该函数从基类中取出并强制它调用继承的函数

检查版本运行:

signup = CompanySignupForm.as_view()
print signup.__class__

url(r"^signup/$", signup, name="acct_signup")

【讨论】:

  • 添加的代码来检查类是否可以包含 GroupForm 代码,或者具有 as_view() 和 save() 的代码我认为这些调用 GroupForm after_signup() 函数,因为它们是基本级别的函数。
猜你喜欢
  • 2012-10-06
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 2023-03-06
  • 2010-10-25
  • 2020-12-16
相关资源
最近更新 更多