防止特定子类的属性突变

2024-09-29 06:30:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个超类,其中一个属性是枚举

有一些特定的子类继承自这个类,其中只有一个枚举的情况是有意义的,所以理想情况下,我想防止它在这些子类中被更改

下面是一个使用医疗专业人员的最小示例:

from enum import Enum, unique, auto

# My enum for medical specialities
@unique
class Speciality (Enum):
    Anaesthetics = auto()
    Dermatology = auto()
    General_Practice = auto()
    Surgery = auto()

# My superclass
class Doctor:
    speciality = Specialty # Could be any case

# An example subclass
class GP (Doctor):
    speciality = Specialty.GeneralPractice # Must be General Practice

有没有办法使speciality属性在GP子类中不可变?如果没有,有没有实现类似功能的方法


Tags: auto属性my情况enumbe子类class
1条回答
网友
1楼 · 发布于 2024-09-29 06:30:16

基于最初的对话并使用property decorators,这应该是可行的:

>>> from abc import ABC
>>> class Doctor(ABC):
...     """Abstract Base Class for doctors."""
...     pass
... 
>>> class GP(Doctor):
...     @property
...     def specialty(self):
...         return Specialty.GeneralPractice
...     @specialty.setter
...     def specialty(self, value):
...         raise ValueError("Unable to modify a Doctor's specialty")

它允许您读取但不写入specialty属性:

>>> gp = GP()
>>> gp.specialty
<Speciality.General_Practice: 3>
>>> gp.specialty = Speciality.Dermatology
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 7, in specialty
ValueError: Unable to modify a Doctor's specialty

进一步阅读:PropertyAbstract Base Classes

相关问题 更多 >