3

我相信一个测试用例值一千字:

#!/usr/bin/env python3

def generate_a(key):
    class A(object):
        def method(self):
            return {'key': key,}
    return A

BaseForB = generate_a(1337)

class B(BaseForB):
    def method(self):
        dict = super(BaseForB, self).method()
        dict.update({'other_key': 0,})
        return dict

EXPECTED = {'other_key': 0, 'key': 1337,}
RESULT = B().method()

if EXPECTED == RESULT:
    print("Ok")
else:
    print("EXPECTED: ", EXPECTED)
    print("RESULT: ", RESULT)

这提出了:

AttributeError: 'super' object has no attribute 'method'

问题是 - 如何运行A.method()B.method()我试图做的事情super()

编辑

这是更合适的测试用例:

#!/usr/bin/env python3

def generate_a(key):
    class A(object):
        def method(self):
            return {'key': key,}
    return A

class B(object):
    def method(self):
        return {'key': 'thisiswrong',}

BaseForC = generate_a(1337)

class C(B, BaseForC):
    def method(self):
        dict = super(C, self).method()
        dict.update({'other_key': 0,})
        return dict

EXPECTED = {'other_key': 0, 'key': 1337,}
RESULT = C().method()

if EXPECTED == RESULT:
    print("Ok")
else:
    print("EXPECTED: ", EXPECTED)
    print("RESULT: ", RESULT)

问题是 - 我如何选择我感兴趣的父类?

4

3 回答 3

14

你的super()电话是错误的。它应该是

super(B, self).method()

或者在 Python 3.x 中也只是

super().method()

此外,不要dict用作变量名——这会影响内置类。

于 2011-03-09T15:43:50.323 回答
0

或者,您可以像这样调用父母方法:

dict = BaseForC.method(self)
于 2011-11-13T14:02:50.820 回答
0
class B(BaseForB):
def method(self):
    dict = super(BaseForB, self).method()
    dict.update({'other_key': 0,})
    return dict

不对,你应该这样写:

class B(BaseForB):
def method(self):
    dict = super(B, self).method()
    dict.update({'other_key': 0,})
    return dict

在这个情况下:

class C(B, BaseForC):
def method(self):
    dict = super(C, self).method()
    dict.update({'other_key': 0,})
    return dict

您必须使用旧方法来调用 Parent 类的函数。像这样

class C(B, BaseForC):
def method(self):
    dict = B.method(self)
    dict.update({'other_key': 0,})
    return dict
于 2013-06-10T08:56:55.180 回答