【问题标题】:Constructing from a classmethod从类方法构造
【发布时间】:2013-11-01 00:13:52
【问题描述】:

假设我正在 KV 数据存储中创建一个表示和对象的类。创建构造函数非常简单......

class KVObject:
    def __init__(self, key, value, add=True):
        self.key = key
        self.value = value
        if add == True:
            kv_create(key, value)

现在,假设我想检索一个 KV 对象...并从中构造一个类实例。我想我会将这个类方法添加到我的 DataBaseObject 类中。

     @classmethod
     def get_kv_object(cls, key):
         value = kv_get(key)
         cls.__init__(key, value, add=False)

...但是当从类方法 (cls.__init__) 调用 init 时,Python 要求为 self 提供一个参数!

有什么想法吗?非常感谢!我知道这是一个简单的例子,但它绝对适用于一些更复杂、更有趣的情况!

编辑:感谢您的回复。我在研究这个时学到了一些有用的东西,那就是 object.__new__ 在调用 MyClass(...) 时调用对象上的 __init__,有效地为 MyClass.init 提供了一个未初始化的类实例和 args从 MyClass 中调用。同样,按照您的答案中的建议,调用 cls(...) 是有意义的。谢谢。

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    想想你将如何正常地创建一个新的数据库对象,它应该是这样的:

    instance = DatabaseObject(key, value, add=False)
    

    在您的类方法中,第一个参数(在本例中为cls)只是DatabaseObject 的另一个名称,因此要创建一个实例,您需要执行以下操作:

    instance = cls(key, value, add=False)
    

    【讨论】:

      【解决方案2】:
      @classmethod
       def get_kv_object(cls, key):
           value = kv_get(key)
           return cls(key, value, add=False)
      

      __init__没有创建了cls 类的新实例!这是一个在对象创建后立即调用的方法。

      【讨论】:

        猜你喜欢
        • 2018-03-23
        • 2016-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-25
        • 1970-01-01
        • 2011-03-05
        相关资源
        最近更新 更多