инициализировать базовый класс переменной, не выходящей из производного класса - PullRequest
3 голосов
/ 20 марта 2012

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

#!/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()

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

Ответы [ 2 ]

1 голос
/ 20 марта 2012

На основании вашего кода 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 без изменений.

1 голос
/ 20 марта 2012

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

class UserPlugin(BaseClass):
    def __init__(self, *args, **kwargs):
        BaseClass.__init__(self, *args, **kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...