【问题标题】:How to call classmethod of base class from derived class when base class itself is inheriting from another library class (ndb.Model)当基类本身继承自另一个库类(ndb.Model)时,如何从派生类调用基类的类方法
【发布时间】:2021-09-02 22:20:48
【问题描述】:

我知道与python中的类方法相关的问题已经回答了很多次,但是即使在实施了这些解决方案之后,我面临的问题仍然存在。

我遇到了许多确实帮助我理解基本逻辑的答案,但是由于这里的ndb.Model 实现,我发现很难查明问题。

我的代码结构,

class A(ndb.Model):
    @classmethod
    def fun(cls, input):
        db_obj = cls.get_by_id(input) # get_by_id is ndb.Model function that brings record from db
        return db_obj.required_data 

class B(A):
    @classmethod
    def fun(cls, input):
        required_data = super(B, cls).fun(input)

当我们到达cls.get_by_id(input) 时,即使存在所需的记录,也不会从数据库返回任何内容。当我不将派生类fun() 作为类方法并像A.fun() 一样直接调用它时,它就会起作用。但是,我认为这不是正确的实现方式。

对上述内容的任何帮助都会很棒。谢谢!

【问题讨论】:

标签: python google-app-engine app-engine-ndb


【解决方案1】:

您尝试检索的数据存储区实体是 A 实体还是 B 实体?

我怀疑它是 B 实体,因为您使用 B.fun() 开始该过程。

如果是这种情况,那么A.fun() 中的get_by_id 将不起作用,因为它正在尝试检索 A 实体。 A.fun() 中的 cls 是 A 而不是 B,因此它试图获取一个不存在的 A 实体。

一种解决方案可能是修改 A.fun 以同时采用一个参数,该参数指示要检索的实体类型。这可以是类或只是一个字符串。像这样的:

class A(ndb.Model):
    @classmethod
    def fun(cls, input, cls2):
        db_obj = cls2.get_by_id(input) # get_by_id is ndb.Model function that brings record from db
        return db_obj.required_data 

class B(A):
    @classmethod
    def fun(cls, input):
        required_data = super(B, cls).fun(input, cls)

【讨论】:

  • 这并不能直接解决我的问题,但我了解到我们可以通过 cls2 并使用它来访问 fn。这使许多其他事情变得清晰。不能接受此作为答案,因为它可能会误导访问此问题的其他用户。非常感谢上面的回答:)
猜你喜欢
  • 2016-01-13
  • 1970-01-01
  • 2016-07-03
  • 2014-12-23
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多