【问题标题】:How to access a method inside a class?如何访问类中的方法?
【发布时间】:2019-05-14 11:45:14
【问题描述】:

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

【问题讨论】:

  • 我认为您可以摆脱A._repr = my_func,但您必须在获得任何实例之前这样做,但重要的问题是您为什么要这样做?
  • 使用super().__repr__()
  • @Nullman 当然是为了圣诞老人的荣耀......好吧,实际原因是我在某些情况下覆盖了 __eq__ 魔术方法,但在其他情况下没有,所以我需要一个默认的 __eq__回退到的方法。

标签: python python-2.7 class


【解决方案1】:

我想你在寻找,

super().__repr__()


class A:
    # original_repr = ?__repr__

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

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

【讨论】:

  • 当我在代码中测试它时,这个解决方案返回的 repr 与 __repr__ 未被覆盖的类不同。 yours return : ", NULL>" original return: "'<__main__.a object at>' 这意味着“保存”原始方法的目标没有达到。
【解决方案2】:
def __repr__(self):
        if self.switch:
            return "Hello"
        return super().__repr__()

【讨论】:

    【解决方案3】:

    您可以通过super().__repr__() 回退到超类的__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只是一个继承自object的普通类,代码将变为

    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>
    

    【讨论】:

    • 如果我没有可回退的父类并且只想保存当前类的__repr__ 怎么办?
    • 您提到I want to call class original __repr__ method,如果您没有父类,则会打印对象类的__repr__,类似于&lt;__main__.A object at 0x103275908&gt; @Sajuuk 也不确定您的意思saving __repr__ 方法?
    • 我想确定一件事:X: __repr__ of a parent-less class Y: 从这个类的实例调用像 `super(self.__class__).__repr__ 是 X 和 Y一样吗?
    • 检查我更新的答案,看看它现在对你是否有意义!是的 X 和 Y 是一样的,它们看起来像。 &lt;__main__.ClassName object at 0x....&gt; 因为它调用 __repr__object 类 @Sajuuk
    • 那是什么? &lt;super: &lt;class 'D'&gt;, NULL&gt; # 来自使用 super().__repr__() in overidden __repr__ 的输出,你可以看到我更新的问题。
    猜你喜欢
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    相关资源
    最近更新 更多