【问题标题】:How can I call superclass method with data from subclass?如何使用子类中的数据调用超类方法?
【发布时间】:2020-06-11 23:03:49
【问题描述】:

我正在解析 XML 文件中的数据,我需要将其中的一些转换为整数 - 将它们设置为 B 类的属性时。由于我有多个子类,因此我尝试在超类中编写一次代码,而不必在每个子类中编写代码。

class A:

  def __setattr__(self, name, value):
    if isinstance(__class__.__dict__[name], int):
      self.__dict__[name] = int(value)

class B(A):

  val = int()

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


b = B("4")
print(type(b.val))

我的问题是 __class__self 指的是超类。我需要来自子类的那些。有什么想法吗?


我不确定我是否很好地解释了我的问题,所以如果我必须只为一个班级这样做,这里是代码:

class A:
  val = int()

  def __init__(self, val1): #val1 is a string
    self.val = val1

  def __setattr__(self, name, value):
    if isinstance(A.__dict__[name], int):
      self.__dict__[name] = int(value)

b = A("4")
print(type(b.val)) #prints <class 'int'>

【问题讨论】:

  • 创建 class 属性 val 似乎没有意义。这不是实例属性的声明。
  • 这是一种保持我想要的具有相同名称的实例属性的类型的方法。
  • 评论也可以做到这一点。
  • self 指的是 object,而不是任何特定的类。
  • 这里我使用class属性进行比较:isinstance(class.__dict__[name], int)

标签: python inheritance polymorphism python-3.5


【解决方案1】:

使用classmethod获取派生类并将已知的self作为参数传递

class A:

  def __setattr__(self, name, value):
    self._setter(self, name, value)

  @classmethod
  def _setter(cls, self, name, value):
      if isinstance(getattr(cls, name), int):
         self.__dict__[name] = int(value)

class B(A):

  val = int()

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


b = B("4")
print(type(b.val), b.val)

您可以只在类中分配类型本身,而不是分配一个变量并使用它的类型。我把它全部放在一个名为 schema 的字典中,因为这似乎更好地记录了我正在发生的事情。

class A:

  schema = {}

  def __setattr__(self, name, value):
    self._setter(self, name, value)

  @classmethod
  def _setter(cls, self, name, value):
      if name in cls.schema:
          value = cls.schema[name](value)
      self.__dict__[name] = value

class B(A):

  schema = {"val":int}

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

b = B("4")
print(type(b.val), b.val)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    相关资源
    最近更新 更多