【问题标题】:Using super with class method in python在python中使用super与类方法
【发布时间】:2014-06-16 07:15:46
【问题描述】:

我正在尝试了解如何进行这项工作。我想使用类方法实例化父类。这段代码给了我一个错误:

class Base(object):
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

    @classmethod
    def class_method(cls, a, b, c):
        return cls(a, b, c)

class Child(Base):
    def __init__(self, x, y, z, p):
        super(Child, self).class_method(x, y, z)
        self.p = p

c = Child(1, 2, 3, 10)

我收到以下错误:

TypeError: __init__() takes at least 5 arguments (4 given)

我也知道原因。这是因为cls 变量包含Child 类。所以当cls(a, b, c)被调用时,python会尝试用4个参数来初始化Child类,selfabc。但是Child 类需要 5 个参数。 如何实现此功能?我知道除非绝对必要,否则我们不应该使用工厂方法。假设它是必要的。

【问题讨论】:

  • 就是重点,我要调用类方法。在这种情况下,它什么也不做,但它可以对输入进行一些转换并将其传递给 init 方法
  • 我不认为你的类方法做你认为它做的事情。它不是修改当前对象,而是简单地返回一个新实例化的对象。你可以使用“Base.class_method(x, y, z)”来调用类方法,但是除非你真正使用它的结果,否则它是没有用的。
  • 我明白了,我的方法是错误的。但是如何使用类方法实例化一个超类呢?这是我的主要问题

标签: python-2.7 inheritance super


【解决方案1】:

您实际上不应该在这种特定情况下使用@classmethod
@staticmethod 是一个更好的解决方案

如您所见,Child 类被传递到 Base.do 方法中。
但如果你想一直使用 Base 类,只需像这样制作静态方法

class Base:
    @staticmethod
    def do(a, b, c):
        return Base(a, b, c)

使用@staticmethod 更好,因为在Base 类的do 方法中,您希望始终使用同一个类而不是其他类

这可能是一个小问题,比方说,重命名类,但可以使用 IDLE(或几乎任何其他文本编辑器)替换功能(编辑 > Replce (Ctrl + H))处理它

【讨论】:

  • class Base: @classmethod def do(cls, a, b, c): return cls(a, b, c) 如果有人想要创建一个子类会更安全。
【解决方案2】:

在这个确切的例子中你应该做的是:

class Base(object):
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z

    @classmethod
    def class_method(cls, a, b, c):
        return cls(a, b, c)

class Child(Base):
    def __init__(self, x, y, z, p):
        super().__init__(x, y, z)
        self.p = p

c = Child(1, 2, 3, 10)

但是,假设您确实要调用类方法,则永远不应该调用__init__ 中的类方法(至少一个行为类似于工厂的方法)。初始化发生在类实例化之后。因此,您需要覆盖__new__。并且,您需要能够完全构造具有原始签名的类才能使用原始类方法,因此您也需要在子类中覆盖该类方法。

【讨论】:

    猜你喜欢
    • 2010-12-21
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 2018-05-27
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多