强制从基类使用基类函数

2024-10-03 17:16:59 发布

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

这个问题的答案很可能是“什么!?什么!@$--住手!!真是个糟糕的主意!”,但我想听听你的想法

我有两个类,一个继承另一个

class A(object):
    def t1(self):
        self.t2()
    def t2(self):
        print "A"

class B(A):
    def t1(self):
        super(B, self).t1()
    def t2(self):
        print "B"

>>> a = A()
>>> b = B()
>>> a.tl()
A
>>> b.t1()
B

在本例中,B.t1调用super函数,以调用A.t1,但是当它到达self.t2()时,在A.t1函数中它返回到B类以执行B.t2()

我怎样才能强制基类的调用留在基类中呢?这就是我所能想到的,而且很管用,但我想有更好的解决办法

class A(object):
    def t1(self):
        if type(self) == A:
            self.t2()
        else:
            super(type(self), self).t2()
    def t2(self):
        print "A"

class B(A):
    def t1(self):
        super(B, self).t1()
    def t2(self):
        print "B"

>>> a = A()
>>> b = B()
>>> a.tl()
A
>>> b.t1()
A

Tags: 函数答案selfobjectdeftype基类class
2条回答

At1中,您可以执行A.t2(self)。然而,这种设置可能是一个脆弱的设计指标

使用双下划线,即name mangling

class A(object):
    def t1(self):
        self.__t2()  # <   changed the call
    def t2(self):
        print "A"

    __t2 = t2  # private copy of original t2() method

>>> a = A()
>>> b = B()
>>> a.tl()
A
>>> b.t1()
A

但是名称损坏有一个巨大的默认值:如果函数只有双下划线作为名称,那么单元测试将变得更加困难和丑陋

但我和@BrenBarn在一起,感觉像是一个脆弱的设计

相关问题 更多 >