是否可以将一个类的方法导入Python中的另一个类?

时间:2019-12-29 20:09:00

标签: python

我在python中有两个类:

  1. ClassA从其他类似方法中的较大字符串中获取字符串
  2. ClassB从其他类似方法中的较大字符串中删除字符串

这要复杂得多,这就是我使用类的原因。最初,我将所有方法都放在一个类中,但是有点不可读,我想将这些方法逻辑上分为两部分,因此我将一些函数移到了ClassB中。 ClassA和ClassB没有父子关系,并且相似,但是我希望它们保持分隔。

我希望能够从ClassA访问ClassB方法。有没有一种方法可以从类A访问类B方法而不必创建新对象;通过执行诸如将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)

我有第二个问题,假设第一个问题是可能的。到目前为止,我在A类中有大约30种方法,在B类中有15种方法。初始化classA对象时,有没有办法让我有一个可选参数来添加其他方法。我将始终需要在字符串上使用ClassA方法,但是我并不总是需要在字符串上使用classB方法。这会以任何重要方式使程序更高效吗?

2 个答案:

答案 0 :(得分:1)

了解classes和继承,您可能会得到类似

的信息
class ModifiableText(object):
  ...

class ModifiableBook(ModifiableText):
  ... 

如果这是您一生中想要做的事情,我建议您也谷歌搜索“域建模”并阅读。

答案 1 :(得分:1)

使用的最干净,最不容易破解的模型可能依赖于混合继承模式,并可能与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类中,并在必要时覆盖这些共享方法。

在上面的示例中,如果您拥有FooBar的实例,则它们将具有与MixinSource中相同的方法,以及在其中创建的任何其他方法那些继承者类。此外,Bar类将与overwrite_me的{​​{1}}方法实现不同的实现。

它还允许您从其他类继承,这样可以使域保持不同,这听起来像是您的偏爱。您可以在这里阅读有关Python混合模式的更多信息:https://softwareengineering.stackexchange.com/questions/312339/are-python-mixins-an-anti-pattern

还有更高级的方法来对涉及Abstract Base Classes的概念进行建模。基本上,您定义一个混入的ABC,定义必须由继承类实现的共享方法(使用MixinSource装饰器),然后定义在ABC中实现的共享方法本身。如果确实需要,您可以充分利用ABC注册和子类挂钩逻辑(请参阅上面链接的Python文档),将ABC的条件逻辑/条件注册应用于基于其属性的继承类。但是,这将是一个主要的反模式,并使任何维护您代码的人都很难遵循您的代码(可以想象自己在未来三到四年内遵循这种逻辑)。

因此,如果您愿意,您可以这样做,但是我绝对会仔细考虑是否增加这种复杂性确实值得。

希望这会有所帮助!