如何访问类中的方法?(How to access a method inside a class?)

2019-10-29 08:08发布

环境: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__

Answer 1:

您可以在后备__repr__通过超一流的法super().__repr__() 我会通过继承一个新类下面显示的例子。

因此,如果我们有一个父class B如下,与它自己的__repr__定义

class B:

    def __repr__(self):

        return 'This is repr of B'

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

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))

正如预期的那样,第一壳体将触发__repr__ A和第二壳体将触发__repr__ B的

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>


Answer 2:

我想你要找的,

super().__repr__()


class A:
    # original_repr = ?__repr__

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

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


Answer 3:

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


文章来源: How to access a method inside a class?