Python 如何引用超类中的子类?

Python 如何引用超类中的子类?,python,Python,我正在定义一个PythonHoliday类和三个子类:一个用于固定日期假日,第二个用于相对假日,第三个用于浮动星期一假日。我想在超类Holiday中创建一组常量,这样应用程序就可以简单地将特定的假日称为 Holiday.NEW_YEARS Holiday.CHRISTMAS etc. 但是当父类被实例化时,子类显然不存在。我该怎么做 class Holiday(object): NEW_YEARS = FixedHoliday(1, 1) MLK_BIRTHDAY = Floa

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

Holiday.NEW_YEARS
Holiday.CHRISTMAS
etc.
但是当父类被实例化时,子类显然不存在。我该怎么做

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

类不能也不应该引用其派生类。请尝试以下方法:

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)

可能的重复可能需要另一个父类,
Holiday
可以从中继承常量。这不是一个好的OO。超类不应该知道其子类,也不应该与其子类交互。如果你想做类似的事情,创建一个注册表或工厂,它不是从
Holiday
派生出来的,而是知道如何创建一个。我不认为这是一个重复,因为我不确定需求是否满足sense@JimStewart:虽然我大体上同意,但在这种情况下,OP实际上只是使用基类作为名称空间(即容器)-因此,我认为他们想要做的将是对经验法则的一个例外,或者至少陷入一个灰色区域…我根本不理解这段代码。为什么在基类中使用全局命名约定?你所说的“全局命名约定”是什么意思?资本化意味着PEP8Source为此提供了全局变量?在PEP8中,类名总是以大写字母开头,请参见。但是,这不是PEP8讨论。因此,您讨论的是类属性。您没有提到。我只是从OP中复制了它。无论如何,这一讨论完全没有建设性,也不重要集成电路。