python: sth как параметризованное наследование - PullRequest
1 голос
/ 27 октября 2009

Я хочу, чтобы у моих классов X и Y был метод f(x), который вызывает функцию func(x, y), так что X.f(x) всегда вызывает func(x, 1), а Y.f(x) всегда вызывает func(x, 2)

class X(object):
    def f(self, x):
        func(x, 1)

class Y(object):
    def f(self, x):
        func(x, 2)

Но я хочу поместить f в общий базовый класс B для X и Y. Как я могу передать это значение (1 или 2), когда я наследую X и Y от B? Могу ли я иметь что-то вроде этого (C ++, как псевдокод):

class B(object)<y>:  # y is sth like inheritance parameter
    def f(self, x):
        func(x, y)

class X(B<1>):
    pass

class Y(B<2>):
    pass

Какие приемы используются в Python для таких задач?

Ответы [ 2 ]

6 голосов
/ 27 октября 2009

Python более гибок, чем вы думаете.

Я думаю, вы хотите что-то вроде этого:

class B(object):
    def f(self,x):
        func(x, self.param)

class X(B):
    param=1

class Y(B):
    param=2

NB

  • обратите внимание, что метод f имеет self как первый параметр.
  • параметры = строки являются переменными класса.
1 голос
/ 27 октября 2009

Вы можете использовать декоратор классов (Python 2.6 и выше), если вы просто хотите добавить общую функцию к нескольким классам (вместо использования наследования).

def addF(y):
    def f(self, x):
        return "Hello", x, "and", y

    def decorate(cls):
        cls.f = f
        return cls

    return decorate


@addF(1)
class X(object):
    pass

@addF(2)
class Y(object):
    pass

print X().f("X")
print Y().f("Y")

>>> 
Hello X and 1
Hello Y and 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...