python - 是否可以将一个类的方法导入 Python 中的另一个类?
问题描述
我在 python 中有两个类:
- ClassA 在其他类似方法中从更大的字符串中获取字符串
- ClassB 在其他类似方法中从较大的字符串中删除字符串
它比这更复杂,这就是我使用类的原因。最初我在一个类中拥有所有方法,但它变得有点不可读,我想在逻辑上将方法分成两个部分,所以我将一些函数移到 ClassB 中。ClassA 和 ClassB 没有父子关系,并且相似,但我希望它们保持分离。
我希望能够从 ClassA 访问 ClassB 方法。有没有一种方法可以让我从 Class A 访问 ClassB 方法而无需创建新对象;通过将 ClassB 的方法导入或添加到 Class A 之类的操作。
class readText:
def __init__(self, book):
self.book = book
def getPageFromNum(self):
##Some Code
def getLineFromPage(self):
##Some Code
class modifyText:
def __init__(self, book):
self.book = book
def removeLine(self, lineNumber):
##Some Code
def removeWordInstances(self, word)
##Some Code
readableBook = readText(book)
##Accessing methods of the objects classes
readableBook.getLineFromPage()
##I want to be able to access methods of the other class modifyText in the same way like below
readableBook.removeLine(50)
我有第二个问题,假设问题 1 是可能的。到目前为止,我在 classA 中有大约 30 个方法,在 classB 中有 15 个方法。在初始化 classA 对象时,有没有办法可以有一个可选参数来添加其他方法。我总是需要对字符串使用 ClassA 方法,但我并不总是需要对字符串使用 ClassB 方法。这会以任何显着的方式使程序更有效率吗?
解决方案
可能使用的最简洁和最简单的模型依赖于混合继承模式,可能与Abstract Base Classes结合使用。
基本原则是定义一个混合类,该类不打算单独实例化,而是用于实现由其相关类共享的方法。
所以你可以有这样的东西:
class MixinSource:
...
def shared_method1(self, param1):
...
def shared_method2(self):
...
def overwrite_me(self, param1, param2):
...
class Foo(SomeOtherClass, MixinSource):
...
class Bar(YetAnotherClass, MixinSource):
...
def overwrite_me(self, param1, param2):
...
这段代码的基本作用是允许您将共享代码保留在MixinSource
类中,并在必要时覆盖这些共享方法。
在上面的示例中,如果您有一个Foo
或的实例Bar
,它们都将具有与 in 相同的方法MixinSource
以及您在这些继承者类中创建的任何其他方法。此外,该类将Bar
具有与overwrite_me
.MixinSource
它还允许您从其他类继承,以便您可以保持您的域不同,因为这听起来像是您的偏好。您可以在此处阅读有关 Python 混合模式的更多信息:https ://softwareengineering.stackexchange.com/questions/312339/are-python-mixins-an-anti-pattern
还有一些更高级的方法可以对这个概念进行建模,涉及抽象基类。基本上,您定义一个作为混入的 ABC,定义必须由继承类(使用abstractmethod
装饰器)实现的共享方法,然后定义在 ABC 本身内实现的共享方法。如果您真的想要,您可以非常喜欢 ABC 注册和子类挂钩逻辑(请参阅上面链接的 Python 文档),以根据它们的属性将 ABC 的条件逻辑/条件注册应用到您的继承类。然而,这将是一个主要的反模式,并且会让任何维护你的代码的人都很难遵循你的代码(想象一下你自己在三四年后试图遵循这个逻辑)。
所以如果你愿意,你可以这样做,但我肯定会仔细考虑增加的复杂性是否真的值得。
希望这可以帮助!
推荐阅读
- jenkins - 使用 Groovy 脚本在 Jenkins 中分配节点超时
- ios - UIPopoverView 跟随 uitextfield 光标
- javascript - 如何让 webpack 在每次更改时重建 server.js 并让 nodemon 重新启动服务器?
- javascript - 从base64节点js转换后.txt文件开头出现一些随机字符
- unity3d - Unity Shader Graph - 跟随对象形状的Grandient
- routes - TYPO3 felogin - 如何通过 Hook 将 preserveGETvars 或 redirect_url 设置为实际页面?
- x509 - 单个 PKI 可以与多个证书策略相关联吗?
- flutter - 颤振中的提供者层次结构
- python - Python:将一个numpy数组写入txt文件
- java - 如何使用 bufferedreader 和 treeset 从文本中显示不同单词的数量?