如何访问类内的方法?

时间:2019-05-14 11:45:15

标签: python python-2.7 class

环境:Python 2.7(可能相关)。

例如,我想根据是否已设置实例的属性来调用类原始__repr__方法。

class A(object):
    # original_repr = ?__repr__

    def __init__(self, switch):
        self.switch = switch

    def __repr__(self):
        if self.switch:
            return self._repr()
        else:
            # return saved original __repr__ method.


def custom_repr(self):
    pass

a = A()
a._repr = MethodType( custom_repr, a, A)

如何保存课程的__repr__方法?

显然,我不能像在实例中那样使用self

也不能使用A.__repr__,因为A本身当时尚未定义。

编辑:有人建议使用super().__repr__,但是,我在代码中对其进行了测试:

class C(object):
    pass

class D(object):
    def __repr__(self):
        return super(self.__class__).__repr__()

c = C()
d = D()

# repr(c) --> '<__main__.C object at 0x0000000003AEFBE0>'
# repr(d) --> "<super: <class 'D'>, NULL>"

您会看到super().__repr__与原始__repr__

不同

3 个答案:

答案 0 :(得分:1)

我认为您正在寻找

super().__repr__()


class A:
    # original_repr = ?__repr__

    def __init__(self, switch):
        self.switch = switch

    def __repr__(self):
        return super().__repr__()

答案 1 :(得分:1)

def __repr__(self):
        if self.switch:
            return "Hello"
        return super().__repr__()

答案 2 :(得分:0)

您可以通过__repr__退回到超类的super().__repr__()方法。下面将通过子类化一个新类来显示示例。

因此,如果我们具有如下的父项class B,并定义了自己的__repr__

class B:

    def __repr__(self):

        return 'This is repr of B'

然后我们像以前一样有一个孩子class A,它是从B继承的,它可以按如下方式回落到B的__repr__

class A(B):

    def __init__(self, switch):
        super().__init__()
        self.switch = switch

    def __repr__(self):
        #If switch is True, return repr of A
        if self.switch:
            return 'This is repr of A'
        #Else return repr of B by calling super
        else:
            return super().__repr__()

您可以通过执行此操作来测试

print(A(True))
print(A(False))

按预期,第一种情况将触发A的__repr__,第二种情况将触发B的__repr__

This is repr of A
This is repr of B

如果A只是从对象继承的普通类,则代码将更改为

class A:

    def __init__(self, switch):
        super().__init__()
        self.switch = switch

    def __repr__(self):
        #If switch is True, return repr of A
        if self.switch:
            return 'This is repr of A'
        #Else return repr of superclass by calling super
        else:
            return super().__repr__()

输出将更改为

print(A(True))
#This is repr of A
print(A(False))
#<__main__.A object at 0x103075908>