python:类似参数化继承的东西

1 投票
2 回答
682 浏览
提问于 2025-04-15 15:24

我想让我的两个类 XY 都有一个方法 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 中,让 XY 都可以继承。那我该怎么在从 B 继承 XY 的时候,把这个值(1 或 2)传进去呢?我能不能有类似这样的东西(像 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

Python比你想象的要灵活得多。

我觉得你可能想要的是这样的:

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

class X(B):
    param=1

class Y(B):
    param=2

注意

  • 注意方法f的第一个参数是self。
  • param=后面的内容是类变量。
1

如果你想给几个类添加一个共同的功能,可以使用类装饰器(适用于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

撰写回答