【发布时间】:2019-04-15 18:14:32
【问题描述】:
我目前learningpython中的模板方法模式。
我想知道是否有任何方法可以保护基类中的某些函数以使子类无法覆盖?如下,子类中的_primitive_operation_3 覆盖了基类中的相同函数。
import abc
class AbstractClass(metaclass=abc.ABCMeta):
"""
Define abstract primitive operations that concrete subclasses define
to implement steps of an algorithm.
Implement a template method defining the skeleton of an algorithm.
The template method calls primitive operations as well as operations
defined in AbstractClass or those of other objects.
"""
def template_method(self):
self._primitive_operation_1()
self._primitive_operation_2()
self._primitive_operation_3()
# Functions must be specified by subclass (i.e., subclass variant)
@abc.abstractmethod
def _primitive_operation_1(self):
pass
# Functions must be specified by subclass (i.e., subclass variant)
@abc.abstractmethod
def _primitive_operation_2(self):
pass
# Functions inherited and not modified by subclass (i.e., subclass invariant)
def _primitive_operation_3(self):
print ('Execute operation #3 from main class')
class ConcreteClass(AbstractClass):
"""
Implement the primitive operations to carry out
subclass-specificsteps of the algorithm.
"""
def _primitive_operation_1(self):
pass
def _primitive_operation_2(self):
pass
# You can still overwrite it if you want
def _primitive_operation_3(self):
print ('Execute operation #3 from subclass')
def main():
concrete_class = ConcreteClass()
concrete_class.template_method()
if __name__ == "__main__":
main()
如果无法防止基类中的方法被覆盖,我该如何放置一些东西来发出自动警报/警告,指示基类中的特定方法已被覆盖?
【问题讨论】:
-
为什么会有问题?重写父方法是子类化的point。
-
我的理解是模板方法模式,有些方法是由子类指定的(这将是抽象方法),而其他方法将保持不变,我想保持不变的方法受保护,因此子类不会意外更改它。
-
@jonrsharpe:并非总是如此。许多框架基类实现需要某些东西才能在没有被覆盖的情况下工作。 Python 甚至有专门的机制来规避这个问题……
标签: python python-3.x overriding subclassing