这是在Python类之间共享函数的有效方法吗?

时间:2019-01-23 01:13:28

标签: django python-3.x

我的目标是在Python的多个类中使用相同的函数。

我已经看到了有关mixin和继承等问题的讨论,但它们似乎都带有警告和警告,请注意正确做事。

所以我想知道我是否可以调用位于类之外的另一个普通旧函数。看来可行,但是也许我没能理解一些重要的东西?

所以我的问题是-这是在Python类之间共享函数的有效方法吗?

def clean_reference_url(self):
    if not self.cleaned_data['reference_url']:
        return ''
    try:
        if 'illegaltext' in self.cleaned_data['reference_url']:
            raise Exception
    except:
        raise forms.ValidationError('You cannot put illegaltext in this field.')
    return self.cleaned_data['reference_url']

class ContactForm(forms.ModelForm):

    def clean_reference_url(self):
        return clean_reference_url(self)

class TripForm(forms.ModelForm):

    def clean_reference_url(self):
        return clean_reference_url(self)

1 个答案:

答案 0 :(得分:4)

这是有效的,但是没有必要额外包裹一层。混合方法是最简单的方法,但是是的,它有一些警告(很大程度上与元类有关),因此,如果要避免这种情况,您仍然可以通过在每个类的定义期间进行设置来在多个类中设置一个方法。保持函数定义相同,并将类更改为:

class ContactForm(forms.ModelForm):
    clean_reference_url = clean_reference_url

class TripForm(forms.ModelForm):
    clean_reference_url = clean_reference_url

同样,mixin更加干净,例如:

class CleanableUrl:  # Change name as appropriate
    def clean_reference_url(self):
        # ...

class ContactForm(CleanableUrl, forms.ModelForm):
    # No need to talk about clean_reference_url at all

class TripForm(CleanableUrl, forms.ModelForm):
    # No need to talk about clean_reference_url at all

,并且通常是最Python化的方法,假设它适用于您的情况(基本类型上没有冲突的元类)。