2012-03-19 2 views
3

Я пытаюсь предоставить фреймворк, который позволяет людям писать свои собственные плагины. Эти плагины являются в основном производными классами. Мой базовый класс нуждается в некоторых переменных для инициализации, как я могу инициализировать мой базовый класс, не позволяя моему производному классу кормить переменную в инициализации базового класса?инициализировать базовый класс с переменной, не входящей из производного класса

#!/bin/python 

class BaseClass(): 
    def __init__(self,config): 
     self.config=config 
    def showConfig(self): 
     print "I am using %s" % self.config 

class UserPlugin(BaseClass): 
    def __init__(self,config): 
     BaseClass.__init__(self,config) 
    def doSomething(self): 
     print "Something" 


fubar = UserPlugin('/tmp/config.cfg') 
fubar.showConfig() 

Моя цель состоит в том, чтобы избежать необходимости определения параметра конфигурации в классе UserPlugin, так это то, что я не хочу, чтобы пользователь, который пишет плагин быть обеспокоенным.

+0

Я не понимаю ваш вопрос.. Я получаю это, когда создается экземпляр 'UserPlugin', вы не хотите, чтобы создатель плагина должен был пройти путь к конфигу. Но откуда вы хотите, чтобы путь конфигурации появился? Тогда вы хотите иметь путь по умолчанию для конфигурации Кроме того, инициализация вашего базового класса происходит только при создании экземпляра базового класса. Когда вы создаете экземпляр 'UserPlugin', вы _call_' BaseClass .__ init __() 'на нем, но вы инициализируете экземпляр' UserPlugin'. – senderle

+0

Спасибо за перефразирование мой вопрос, потому что это именно так. Я понимаю, что BaseClass инициируется при запуске UserPlugin , Итог - это то, что я хочу, чтобы UserPlugin мог наследовать методы из BaseClass, для чего требуется инициализация переменной, не передавая эту переменную производному классу. Возможно также, что можно забыть о наследовании и сначала инициировать базовый класс, а затем инициировать UserPlugin внутри BaseClass, но я считаю это немного уродливым. –

+0

Но вы все еще не ответили на мой вопрос. Откуда вы хотите получить путь к конфигу? [Я принял дикое предположение] (http://stackoverflow.com/a/9786902/577088). – senderle

ответ

1

Вы можете использовать argument lists передать оставшиеся аргументы базового класса:

class UserPlugin(BaseClass): 
    def __init__(self, *args, **kwargs): 
     BaseClass.__init__(self, *args, **kwargs) 
+0

Да, я понимаю, но это не так сильно отличается от опубликованного кода, и это то, чего я хотел бы как-то избежать. Думаю, мне придется забыть о наследовании классов и инициировать класс плагина внутри инициированного базового слоя или что-то в этом направлении. Спасибо за информацию, хотя. –

1

на основе кода Pastebin, как об этом? Это позволяет избежать использования отдельного глобального, вместо этого используя атрибут класса, который доступен как член ко всем производным классам и их экземплярам.

#!/bin/python 

class BaseClass(): 
    config = '/tmp/config.cfg' 
    def __init__(self): 
     pass 
    def showConfig(self): 
     print "I am using %s" % self.config 

class UserPlugin(BaseClass): 
    def __init__(self): 
     BaseClass.__init__(self) 
    def doSomething(self): 
     print "Something" 


fubar = UserPlugin() 
fubar.showConfig() 

Это был другой способ сделать это, о котором я упомянул ранее. Имейте в виду, что если вы хотите, чтобы изменить значение самого BaseClass.config, вы должны обращаться к нему напрямую (т.е. BaseClass.config = '/foo/path', в противном случае, вы завершаете создание значения пользовательских UPinstance.config, оставляя неизменным BaseClass.config

+0

Я действительно понимаю, как работают объекты и наследование. Моя фактическая цель - сохранить класс UserPlugin свободным от чего-либо, необходимого для правильной инициализации базового класса. Это звучит глупо и в некотором роде, но я хочу сохранить «требования», чтобы сделать производный класс как можно более низким. Это скорее организационный вопрос, чем вопрос синтаксиса. Тем временем я пришел к идее создания глобальных переменных, которые требует BaseClass для ее инициализации. см. здесь http://pastebin.com/KfdVYbPz Глобалы не идеальны и их следует избегать, если это возможно, но я думаю, что в моем случае это лучший вариант. –

+0

@jay_t, я не думаю, что это ваш лучший вариант. Вы можете просто сохранить его как атрибут класса. См. Выше. – senderle