python - 在 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()
解决方案
从概念的角度来看,您所做的是可以接受的:如果方法的相同属性存在于多个基类中,则必须在子类中添加显式覆盖,可能使用基类实现。
从 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++ 语言中的维护问题(菱形继承)。
推荐阅读
- python - 如何使用 python selenium 访问框架的窗口大小?
- html - 如何将从 XMLHttpRequest 收到的 html 响应放入 Angular7 中的 iframe 中?
- java - 奥利奥和派的后台服务问题
- javascript - 使用 Javascript 编写 Photoshop 脚本:如何解锁部分锁定的图层?
- r - 给定时间除以特定因子的值(dplyr,data.table)
- javascript - 从 jQuery 对 Mathjax 排版函数的第二次调用不起作用
- c++ - 为静态类创建指向对象的指针是否合法?
- vue.js - Vue-Multiselect 对选中的数据进行剖析和交叉复制
- sql - 使用枢轴将 2 行合并为 2 列
- apache-zookeeper - 如何在 Windows 中将 Apache Zookeeper 服务器作为后台服务运行