如何使这段代码在python 2中工作

时间:2015-03-31 11:51:28

标签: python python-2.7 python-3.x

class Event(metaclass=ABCMeta):

    def __init__(self):
        self.type = self.get_full_type()

    @classmethod
    def get_full_type(cls):
        return None

    def as_dict(self):
        return self.__dict__


class BaseEvent(Event, metaclass=ABCMeta):

    SUB_TYPE = ''

    @classmethod
    def get_base_type(cls):
        return super().get_full_type()

    @classmethod
    def get_full_type(cls):
        base_type = cls.get_base_type()
        if base_type:
            return '.'.join([base_type, cls.SUB_TYPE])
        else:
            return cls.SUB_TYPE

在这里你可以看到我尝试创建代表一些抽象事件的类。这里至关重要的是区分事件类型的能力。所以每个事件都有它的类型和它的基本类型。完整类型是基本类型+子类型。

这使得能够定义像这样的新事件类型

class MockEvent(BaseEvent):

    SUB_TYPE = 'mock'

    def __init__(self, some_object):
        super(self.__class__, self).__init__()
        self.some_object = some_object

所以完整类型镜像了类层次结构ClassA.ClassB.ClassC等。我想你明白了。

不幸的是,这不适用于python 2

class Event(object):
    __metaclass__ = ABCMeta
    SUB_TYPE = None
    def __init__(self):
        self.type = self.get_full_type()

    @classmethod
    def get_base_type(cls):
        return None

    @classmethod
    def get_full_type(cls):
        base_type = cls.get_base_type()
        if base_type:
            return '.'.join([base_type, cls.SUB_TYPE])
        else:
            return cls.SUB_TYPE

    def as_dict(self):
        return self.__dict__


class BaseEvent(Event):
    __metaclass__ = ABCMeta
    SUB_TYPE = ''

    @classmethod
    def get_base_type(cls):
        return super(cls.__class__, cls).get_full_type()
  

文件“/opt/leos/code/event_service/events/EventBus.py”,第38行,   get_base_type       return super(cls。 class ,cls).get_full_type()   AttributeError:'super'对象没有属性'get_full_type'

我该如何做到这一点?

1 个答案:

答案 0 :(得分:0)

class Event(object):
    __metaclass__ = ABCMeta
    def __init__(self):
        self.type = self.get_full_type()

    @classmethod
    def get_full_type(cls):
        return None

    def as_dict(self):
        return self.__dict__


class BaseEvent(Event):
    __metaclass__ = ABCMeta
    SUB_TYPE = None

    @classmethod
    def get_full_type(cls):
        super_type = cls.get_super_type()
        base_type = super_type.get_full_type()
        if base_type:
            return '.'.join([base_type, cls.SUB_TYPE])
        else:
            return cls.SUB_TYPE

    @classmethod
    def get_super_type(cls):
        return cls.__base__

我需要自动获取基本类型。没有提到super中的当前类(currectClass,self)所以我使用了cls。 base 并且它正常工作。