如何引用超类中的子类?

2024-06-09 01:50:55 发布

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

我正在定义一个PythonHoliday类和三个子类:一个用于固定日期假日,第二个用于相对假日,第三个用于浮动星期一假日。我想在超类Holiday中创建一组常量,这样应用程序就可以简单地将特定的假日引用为

Holiday.NEW_YEARS
Holiday.CHRISTMAS
etc.

但是当父类被实例化时,子类显然不存在。我该怎么做?你知道吗

class Holiday(object):
    NEW_YEARS = FixedHoliday(1, 1)
    MLK_BIRTHDAY = FloatingMonday(1, 15)
    ...

Tags: 实例应用程序new定义objectetc子类class
2条回答

类不能也不应该引用它的派生类。请尝试以下操作:

class BaseHoliday(object):
    pass

class FixedHoliday(BaseHoliday):
    # class code

# more classes

class Holidays(object):
    NEW_YEARS = FixedHoliday(1, 1)
    MLK_BIRTHDAY = FloatingMonday(1, 15)

一种方法是在定义基类和所有子类之后修饰基类。在Python中可以这样做,因为类是可变对象。你知道吗

我的建议是:

class Holiday:
    def __init__(self, month, day):
        self.month, self.day = month, day

    def __repr__(self):
        return '{}(month={}, day={})'.format(type(self).__name__, self.month, self.day)

class FixedHoliday(Holiday):
    pass

class FloatingMonday(Holiday):
    pass

#class MondayHoliday(Holiday): ... etc    


# Base class decorator.
def inject_constants(cls):
    """ Add attributes to class. """
    HOLIDATA = {
        'NEW_YEARS': FixedHoliday(1, 1),
        'MLK_BIRTHDAY': FloatingMonday(1, 15)
    }

    for key, value in HOLIDATA.items():
        setattr(cls, key, value)


inject_constants(Holiday)

print(Holiday.NEW_YEARS)    # -> FixedHoliday(month=1, day=1)
print(Holiday.MLK_BIRTHDAY) # -> FloatingMonday(month=1, day=15)

相关问题 更多 >