2015-06-21 2 views
0

Я хочу иметь список классов в файле базового класса, который содержит производные классы, как они создаются во время выполнения:Заполняем список классов в Python в модуле базового класса

BaseClass.py:

# This is a list of objects to populate, holds classes (and not instances) 
MyClassesList=[] 

class MyBase(object): 
    name='' #name of the specific derived class 

    def __init__(self): 
     pass 

Это реальный пример:

Я не в состоянии изменить любой производные классы кода, поэтому я хочу, чтобы сохранить список добавленных серверов в барельефе е класс, а затем этот список во время выполнения

# Populate the Servers list automatically. 
# This is a list of available servers to choose from, holds classes (and not instances) 

Servers=[] 

class ServerBase(object): 
    name='' #name of the specific server class, for each server class 

    def __init__(self): 
     self.connected = False 

    def __del__(self): 
     self._disconnect() 

    def connect(self): 
     DBG("connect called for server {self.name}, is already connected: {self.connected}") 
     if self.connected: return 
     self._connect() 
     self.connected = True 


    def get_data(self): 
     self.connected or self.connect() 
     data='' 
     # We're obligated to read the data in chunks. 
     for i in range(100): 
      data += self._get_data() 
     return data 

    def _connect(self): 
     raise NotImplementedError("Interface Function Called") 

    def _disconnect(self): 
     raise NotImplementedError("Interface Function Called") 

    def _get_data(self): 
     raise NotImplementedError("Interface Function Called") 
+0

Не могли бы вы предоставить больше информации? Как эти производные классы создаются во время выполнения? – poros

+0

Обычно это делается метаклассами или заводскими методами. В этом случае я предлагаю вам взглянуть, как работают метаклассы. Хотя я должен сказать, что это не похоже на хорошую идею. – Wolph

ответ

0

Предполагая, что вы хотите, список производных объектов класса (хотя не знаю, почему вы хотите, чтобы) не создан во время выполнения.

При создании объекта производного класса, в вашей __init__ функции базового класса, самость, будучи принятой в бы объекте производного класса, если только производный класс не переопределяет функцию __init__() и не вызывает super().__init(), в этом случае , Я не уверен, что это будет возможно.

Если вы контролируете производные классы, вы можете вызвать super().__init__() в производном классе __init__() и затем функция __init__() сохранить этот объект в список, как вы хотите.

Вы можете использовать этот self, чтобы добавить в требуемый список.

Простой тест, как показано ниже, может помочь вам -

class CA: 
    def __init__(self): 
     print('Type - ' + str(type(self))) 

>>> CA() 
Type - <class '__main__.CA'> 
<__main__.CA object at 0x006B9830> 



class CASub(CA): 
    pass 

>>> CASub() 
Type - <class '__main__.CASub'> 
<__main__.CASub object at 0x006B9890> 

Там могут быть лучшие способы сделать это, это будет один из способов.

Смежные вопросы