Python方法Inheritan

2024-05-01 09:35:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个家长班和两个孩子班。父类是一个抽象基类,它具有子类继承的方法combine。但是每个子级从参数角度实现combine的方式不同,因此它们各自的方法采用不同数量的参数。在python中,当子级继承一个方法并需要重新实现它时,新实现的方法必须逐个参数匹配。有办法吗?也就是说,继承的方法可以有动态的参数组合吗?在

谢谢。在


Tags: 方法参数数量方式孩子动态基类子类
2条回答

此代码演示了重写方法的签名可以轻松更改。在

class Parent(object):
    def foo(self, number):
        for _ in range(number):
            print "Hello from parent"



class Child(Parent):
    def foo(self, number, greeting):
        for _ in range(number):
            print greeting


class GrandChild(Child):
    def foo(self):
        super(GrandChild,self).foo(1, "hey")


p = Parent()
p.foo(3)

c = Child()
c.foo(2, "Hi")

g = GrandChild()
g.foo()

正如对普通类的另一个答案所示,重写的继承方法的签名在子级中可能不同于在父级中的签名。在

即使父类是抽象基类,也是如此:

import abc

class Foo:
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def bar(self, x, y):
        return x + y

class ChildFoo(Foo):
    def bar(self, x):
        return super(self.__class__, self).bar(x, 3)

class DumbFoo(Foo):
    def bar(self):
        return "derp derp derp"

cf = ChildFoo()
print cf.bar(5)

df = DumbFoo()
print df.bar()

不恰当复杂的绕道

在Python元类中,尝试限制重写方法的能力是一个有趣的练习,这样方法的参数签名必须与基类的参数签名匹配。这是一个尝试。在

注意:我并不赞同这是一个好的工程想法,而且我也没有花时间去整理松散的部分,所以下面的代码可能没有什么可以提高效率的地方。在

^{pr2}$

请注意,与Python中大多数“严格”或“私有”类型的思想一样,您仍然可以自由地将修补函数移植到一个“好类”上,并且这些monkey-patched函数不必满足签名约束。在

# Instance level
gc = GoodChild()
gc.foo = lambda self=gc: "Haha, I changed the signature!"

# Class level
GoodChild.foo = lambda self: "Haha, I changed the signature!"

而且,即使您增加了元类的复杂性,该类会在类的__dict__中更新任何方法类型属性时进行检查,并在类被修改时继续发出assert语句,您仍然可以使用type.__setattr__绕过自定义行为并设置属性。在

在这种情况下,我把杰夫·戈德布鲁姆想象成侏罗纪公园的伊恩·马尔科姆,茫然地看着你,说“同意的成年人,嗯,想办法……”

相关问题 更多 >