2015-03-31 77 views
-3
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 

在這裏,您可以看到我嘗試使類代表一些抽象事件。這裏至關重要的是區分事件類型的能力。所以每個事件都有它的類型和基類型。完整類型是基本類型+子類型。如何使這段代碼在python 2中工作

這給像這樣定義

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() 

File "/opt/leos/code/event_service/events/EventBus.py", line 38, in get_base_type return super(cls.class, cls).get_full_type() AttributeError: 'super' object has no attribute 'get_full_type'

我怎樣才能使這項工作?

+0

它什麼時候發生這種錯誤? – thefourtheye 2015-03-31 11:54:19

+0

使'super()。get_full_type()'成爲'super(self .__ class__,self).get_full_type()'? – adarsh 2015-03-31 11:55:03

+0

@thefourtheye我修改了這個問題來回答這個問題。 – user1685095 2015-03-31 11:57:34

回答

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。 基地它的工作正常。