繁体   English   中英

如何在抽象 class 方法中引用抽象共享实现中的子类属性

[英]How to refer to subclass property in abstract shared implementation in abstract class method

对于类:

class Base(ABC):

    def __init__(self, param1):
        self.param1 = param1
        
    @abstractmethod
    def some_method1(self):
        pass

    # @abstractmethod
    # def potentially_shared_method(self):
    #      ????

class Child(Base):
    
    def __init__(self, param2):
        self.param1 = param1
        self.param2 = param2
        
    def some_method1(self):
        self.object1 = some_lib.generate_object1(param1, param2)

    def potentially_shared_method(self):
        return object1.process()

我想移动potentially_shared_method以在抽象 calss 中共享,但是它使用在some_method1中初始化的object1并且需要留在那里。

如果它只是潜在地共享,它不属于 base class。你会违反一些设计原则。

共享没有意义的孩子 class 应该做什么?

此外,您还引入了一些时间耦合; 您只能在调用some_method1之后调用potentially_shared_method 这并不理想,因为您的 class 的用户可能没有意识到这一点。

此外,如果该方法是共享的,您可能不希望它在您的基础 class 中是抽象的; 使用抽象方法,您实际上只是在共享签名; 但您似乎想要共享功能

反正。 这里有一些选项:

  1. 使用 Python 的多个 inheritance,将potentially_shared_method移动到SharedMixin class 中,并让那些共享它的孩子继承自BaseSharedMixin 然后你也可以将some_method1移动到那个SharedMixin class 因为在我看来那些 go 在一起。 或者可能不是...
  2. 将对object1的访问隐藏在 getter 后面。 使 getter 在基类 class 中有一个虚拟实现,并在实际创建object1的那些子类中有一个正确的实现。 然后可以将potentially_shared_method移动到Base并仅引用 getter。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM