【问题标题】:Which is the correct way of using a class method into its subclass that maybe won't be instantiated?在可能不会被实例化的子类中使用类方法的正确方法是什么?
【发布时间】:2020-04-17 13:46:26
【问题描述】:

给定父类:

class Parent():
   _private_attr: Int = None

   @classmethod
   def set_private_attr(cls, value):
      if not type(value) is int:
         raise ValueError()
      cls._private_attr = value

我如何在子类中使用set_private_attr,因为它可能不会被实例化,因此我不能在__init__ 中使用super()

例如:

def SubClass(Parent):
   Parent.set_private_attr(a_value)

是这样吗?有更好的方法吗?

【问题讨论】:

  • 不清楚你在问什么。第二个示例不应该是class SubClass(Parent),在这种情况下它继承 set_private_attr 类方法吗?如果要在创建子类时覆盖继承的_private_attr 值,_private_attr = a_value 会这样做;您不需要调用该方法。
  • 我更新了问题。 set_private_attr 方法也做验证,所以我想用它。
  • 你必须在 类创建之后调用它,然后 - class SubClass(Parent): pass; SubClass.set_private_attr(a_value).

标签: python python-3.x subclassing private-members


【解决方案1】:

需要继承自Parent,然后派生类可以使用set_private_attr()类方法。

这是一个例子。

class Parent():
   _private_attr = None

   @classmethod
   def set_private_attr(cls, value):
      cls._private_attr = value

class Foo(Parent):
    pass

foo = Foo()
foo.set_private_attr("bar")

如果要在构造派生类之前设置:

Foo.set_private_attr("bar")
foo = Foo()
print(foo._private_attr)

【讨论】:

  • 问题是Foo不会被实例化。
  • 您也可以在实例化类之前执行此操作。我已经编辑了我的帖子以显示这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多