【问题标题】:Is it possible to import one class's methods into another class in Python?是否可以将一个类的方法导入 Python 中的另一个类?
【发布时间】:2019-12-29 20:09:00
【问题描述】:

我在 python 中有两个类:

  1. ClassA 在其他类似方法中从较大的字符串中获取字符串
  2. 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 方法。这是否会显着提高程序的效率?

【问题讨论】:

  • 如果方法是实例方法,而不是类或静态方法,则必须在 classA 中使用 classB 的对象,或者使用父子对象

标签: python


【解决方案1】:

可能使用的最简洁和最少hacky的模型依赖于混合继承模式,可能与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 类将具有与MixinSource 不同的overwrite_me 方法的不同实现。

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

还有更高级的方法可以对这个概念进行建模,涉及Abstract Base Classes。基本上,您定义一个作为混入的 ABC,定义必须由继承类实现的共享方法(使用 abstractmethod 装饰器),然后定义在 ABC 本身内实现的共享方法。如果您真的想要,您可以非常喜欢 ABC 注册和子类挂钩逻辑(请参阅上面链接的 Python 文档),以根据它们的属性将 ABC 的条件逻辑/条件注册应用到您的继承类。然而,这将是一个主要的反模式,并且会让任何维护你的代码的人都很难遵循你的代码(想象一下你自己在三四年后试图遵循这个逻辑)。

所以如果你愿意,你可以这样做,但我肯定会仔细考虑增加的复杂性是否真的值得。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    了解classes 和继承,你可能会得到类似的东西

    class ModifiableText(object):
      ...
    
    class ModifiableBook(ModifiableText):
      ... 
    

    如果这是您在生活中想做的事情,我建议您也搜索“领域建模”并阅读。

    【讨论】:

    • 我已经了解继承了。虽然我可以通过 modifiableBook 类从另一个类继承类方法和状态来实现我想要的,但我宁愿不这样做,因为它们没有父子关系。我希望我的代码反映它们没有这种关系,所以如果在初始化 classA 对象时给出了参数,我想通过将 classB 的方法导入 classA 来扩展 ClassA 的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    相关资源
    最近更新 更多