gpt4 book ai didi

python - mixins 应该使用父属性吗?

转载 作者:行者123 更新时间:2023-12-03 18:32:24 24 4
gpt4 key购买 nike

我正在开发一个 python 项目,我需要使用大约 20 个不同的类来实现一系列功能,例如:“下载”、“解析”、“更新”等。

使用父类(super class)可以很容易地分解几个功能,因为它们所需的代码都是相同的。

但有时,特别是对于“解析”方法,我有 10 个类必须实现相同的算法,而其他 10 个类需要特定的算法。

根据我对 python 的了解,可以使用 mixins 轻松分解这种行为。

但即使“解析”算法相同,这里也存在问题,我需要对已解析的条目应用一个标签,而这个标签对每个类都是特定的。我想知道这是否是使用仅由 mixin 使用的类属性来实现此目标的正确方法。

这段代码给出了如何使用属性的示例:

class MyMixin():
def parse(self):
print(self.tag)
...

class MyClass(MyMixin):
tag = 'mytag'

我已经在一些框架( http://www.django-rest-framework.org/api-guide/generic-views/)中看到了它,但我很想知道社区的意见。

===========================

编辑

用一个具体的例子来总结一下,我应该这样写:
class MyMixin():
def do_something(self):
print(self.tag)

class MyClass(MyMixin):
tag = 'mytag'

if __name__ == '__main__':
c = MyClass()
c.do_something()

或者那个 :
class MyMixin():
def do_something(self, tag):
print(tag)

class MyClass(MyMixin):
tag = 'mytag'

if __name__ == '__main__':
c = MyClass()
c.do_something(c.tag)

最佳答案

您可以使用 mixins 在其他类中实现组合。这样,您可以将功能委托(delegate)给 mixin,并在其他类中重用 mixin。因此,使用 python 时,你有两个 mixins 规则:

  • Mixin 类不应派生自任何基类(对象除外)
  • 但他们可能会假设他们将混入的类(class)
    从某个基类派生,因此他们可能假设基类是
    其中他们假设该类具有某些属性。

  • 这两个规则将 mixin 与继承区分开来。

    因此,要回答您的问题,是的,如果您确保父级具有这些属性,则可以使用父级属性。

    一个小例子(来自: https://mail.python.org/pipermail/tutor/2008-May/062005.html):
    class Base(object):
    """Base class for mixer classes. All mixin classes
    require the classes they are mixed in with to be
    instances of this class (or a subclass)."""

    def __init__(self,b):
    self.b = b # Mixin classes assume this attribute will be present

    class MixinBPlusOne(object):
    """A mixin class that implements the print_b_plus_one
    method."""

    def __init__(self):
    print 'MixinBPlusOne initialising'

    def print_b_plus_one(self):
    print self.b+1

    class MixinBMinusOne(object):
    """A mixin class that implements the print_b_minus_one
    method."""

    def __init__(self):
    print 'MixinBMinusOne initialising'

    def print_b_minus_one(self):
    print self.b-1

    class Mixer(Base,MixinBPlusOne,MixinBMinusOne):
    """A mixer class (class that inherits some mixins), this
    will work because it also inherits Base, which the
    mixins expect."""

    def __init__(self,b):
    # I feel like I should be using super here because
    # I'm using new-style classes and multiple
    # inheritance, but the argument list of
    # Base.__init__ differs from those of the Mixin
    # classes, and this seems to work anyway.
    Base.__init__(self,b)
    MixinBPlusOne.__init__(self)
    MixinBMinusOne.__init__(self)

    class BrokenMixer(MixinBPlusOne,MixinBMinusOne):
    """This will not work because it does not inherit Base,
    which the mixins expect it to do."""

    pass

    m = Mixer(9)
    m.print_b_plus_one()
    m.print_b_minus_one()

    m = BrokenMixer(9)
    m.print_b_plus_one() # It'll crash here.

    django restframework 示例也非常好: django rest framework mixins

    关于python - mixins 应该使用父属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36690588/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com