首页 > 解决方案 > 在 Python 的多重继承中使用相同的函数

问题描述

我想用两个具有相同方法的类来实现一个接口。之后,我创建了第四个类,它继承了这两个类的方法。

因此,如果我需要使用类中的方法hdfs_way,我会将参数 1 传递给__init__use_FileSystem,或者如果我想使用类中的方法,则传递 2 hdfs_way

我的代码工作正常,但我不知道这是否是做类似事情的最佳方式。

from abc import ABCMeta, abstractmethod

class FileSystemInterface:
  __metaclass__ = ABCMeta
  @abstractmethod
  def list_dirs(self):
    pass

class hdfs_way(FileSystemInterface):
  def list_dirs(self):
    print("HDFS WAY")
    return None

class java_way(FileSystemInterface):
  def list_dirs(self):
    print("JAVA WAY")
    return None 

class use_FileSystem(hdfs_way,java_way):
  def __init__(self,type_api):
    self.type_api = type_api

  def list_dirs(self):
    if(self.type_api == '1'):
      java_way.list_dirs(self)
    else:
      hdfs_way.list_dirs(self)

a = use_FileSystem('2')
a.list_dirs()

标签: pythonpython-2.7

解决方案


从概念的角度来看,您所做的是可以接受的:如果方法的相同属性存在于多个基类中,则必须在子类中添加显式覆盖,可能使用基类实现。

从 Pythonic 的角度来看,这也是正确的:您使用基类中的未绑定方法,并显式地为它们提供对象。可能更 Pythonic 的是使用,super但只有当你的层次结构有一个自然的中间类时它才有意义:

                                   Child

               BaseA                               BaseB

ImplementationA1 ImplementationA2   ImplementationB1 ImplementationB2
   methodX                                               methodX

然后你可以写:

  def methodX(self):
    if(self.type_api == '1'):
      self.super(BaseA, self)()
    else:
      self.super(BaseB, self)()

(注意 super 在上面的代码中寻找 BaseA 或 BaseB 的第一个基类,因此是中间基类......)


无论如何,从理论的角度来看,如果经常将多重继承视为一个有问题的设计,那么在这种情况下,许多人更喜欢包含模式(has a而不是is a)。例如,它在 Java 语言中是被禁止的,并且已知会导致 C++ 语言中的维护问题(菱形继承)。


推荐阅读