【问题标题】:Python, how to convert an existing parent class object to child class objectPython,如何将现有的父类对象转换为子类对象
【发布时间】:2020-07-10 05:53:26
【问题描述】:

*** 为了说明我为什么要执行以下操作,我正在尝试包装第三方工具并用它做更多事情。

我正在使用第三方工具,它会返回一个对象作为结果。 (例如,Person 类的对象,其中包含 MANY 属性)。

我想声明一个新类,例如Driver(Person)。其中包含 Person 类中的所有内容等等。我不允许修改Person 类。

我已经有一个现有的Person 对象(从第三方工具返回),如何将其转换为Driver 对象?不是通过初始化一个新的空 Driver 对象并将所有内容一一复制到其中...在我的例子中,Person 类中有超过 30 个属性和属性,并且 Person 类不是我需要这样做的唯一类和。我必须用大约 20 节课来做这件事。这就是为什么除非没有其他方法,否则我无法为每个课程从头开始复制。

class Person:
    def __init__(self):
        self._name = None

    @property
    def name(self):
        return self._name


class Driver(Person):
    def __init__(self):
        super().__init__()
        self._gender = None

    @property
    def gender(self):
        return self._gender

    def __str__(self):
        return f'{self.name} {self.gender}'

给定Person 的实例,将其转换为Driver。但是想象一下,这两个类中都有更多的属性。 目前,我基本上只是将 Person 实例作为属性加载到一个新的 Driver 实例中。但我认为必须有一个更聪明的方法来做到这一点。

【问题讨论】:

  • 您如何知道作为驱动程序一部分但人员尚未提供的所有信息的值?
  • 你可以实现一个类方法......
  • 检查here
  • 没有必要。您可以创建一个从人员实例创建驱动程序的类函数
  • 考虑您是否真的需要继承,而不是将给定的Person 对象作为Driver 实例的属性。

标签: python types casting


【解决方案1】:

基本上,一个类的所有属性都存在于神奇的__dict__ 属性中。这个类似字典的对象包含为对象本身定义的所有属性。

因此,一次复制 所有 属性的方法是将__dict__ 属性从一个类复制到另一个类,无论是在方法内还是从这样的实例:

a = Person()
b = Driver()
b.__dict__.update(a.__dict__)

请注意,如果有重复的属性将被覆盖,所以要小心

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-23
    • 2022-09-29
    • 1970-01-01
    相关资源
    最近更新 更多