Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.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
Django 这是在Python类之间共享函数的有效方法吗?_Django_Python 3.x - Fatal编程技术网

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

Django 这是在Python类之间共享函数的有效方法吗?,django,python-3.x,Django,Python 3.x,我的目标是在Python中使用来自多个类的相同函数 我看到过关于混合和继承等的讨论,但它们似乎都附带了关于正确操作的注意事项 所以我想知道我是否可以调用另一个普通的旧函数,它位于类之外。这似乎有效,但也许我没有理解一些重要的事情 所以我的问题是——这是在Python类之间共享函数的有效方法吗 def clean_reference_url(self): if not self.cleaned_data['reference_url']: return '' try

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

我看到过关于混合和继承等的讨论,但它们似乎都附带了关于正确操作的注意事项

所以我想知道我是否可以调用另一个普通的旧函数,它位于类之外。这似乎有效,但也许我没有理解一些重要的事情

所以我的问题是——这是在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)

这是有效的,但没有必要再加一层包装。mix-in方法是最简单的,但是它有一些警告(主要与元类相关),因此如果您想避免这种情况,您仍然可以在多个类中设置一个方法,只需在定义每个类的过程中进行设置。保持函数定义不变,并将类更改为:

class ContactForm(forms.ModelForm):
    clean_reference_url = clean_reference_url

class TripForm(forms.ModelForm):
    clean_reference_url = clean_reference_url
同样,混合器更干净,例如:

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风格的方法。

它是有效的,但没有必要有额外的包装层。mix-in方法是最简单的,但是它有一些警告(主要与元类相关),因此如果您想避免这种情况,您仍然可以在多个类中设置一个方法,只需在定义每个类的过程中进行设置。保持函数定义不变,并将类更改为:

class ContactForm(forms.ModelForm):
    clean_reference_url = clean_reference_url

class TripForm(forms.ModelForm):
    clean_reference_url = clean_reference_url
同样,混合器更干净,例如:

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风格的方法。

我非常喜欢您的第一个建议。。。任何删除我喜欢的代码的东西。我不得不说,如果mixin包含更多的代码和警告,我不明白为什么使用mixin更好。您的第一个建议似乎是尽可能干净可靠地编写代码。事实上,在我看来,您的第一个建议似乎是一种从一堆函数组成类的超级干净的方法。我看不出你的第一个建议有什么坏处,可能会改变我的Python代码,使之以这种方式工作。@DukeDougal:第一种方法有一些轻微的弱点(在你的代码中也很常见)。最主要的一点是,在这种情况下,没有任何arg
super()
是不起作用的(在混合模式下,它可以很好地工作)。诚然,如果所讨论的函数从未在继承层次结构中的任何其他类中重载,那也没什么大不了的。另一个原因很简单,它在函数定义时没有明确地绑定到类,因此IDE也不一定能够理解它。。。任何删除我喜欢的代码的东西。我不得不说,如果mixin包含更多的代码和警告,我不明白为什么使用mixin更好。您的第一个建议似乎是尽可能干净可靠地编写代码。事实上,在我看来,您的第一个建议似乎是一种从一堆函数组成类的超级干净的方法。我看不出你的第一个建议有什么坏处,可能会改变我的Python代码,使之以这种方式工作。@DukeDougal:第一种方法有一些轻微的弱点(在你的代码中也很常见)。最主要的一点是,在这种情况下,没有任何arg
super()
是不起作用的(在混合模式下,它可以很好地工作)。诚然,如果所讨论的函数从未在继承层次结构中的任何其他类中重载,那也没什么大不了的。另一个原因很简单,它在函数定义时没有明确地绑定到类,因此IDE也不一定能够理解它。