如何从超类的实例创建子类的实例?

时间:2017-04-06 19:59:57

标签: python class initialization

我做了两个班,父母和孩子。我想知道的是,是否可以使用父类初始化子类。这是我的代码:

class Pc:

    def __init__(self, brand, processor, price):
        self.brand = brand
        self.processor = processor
        self.price = price

class Laptop(Pc):
    def __init__(self,brand,processor,price, battery):
        Pc.__init__(self,brand,processor,price)
        self.battery = battery

现在我可以用以下内容初始化Laptop类:

b = Laptop('brand','processor','price')

但这对我来说似乎没什么用,我的老师也没有很好地解释它。我很想知道是否可以这样做:

a = Pc("brand","processor","price")
b = Laptop(a, "battery")

当我用我的代码尝试这个时,我收到一个错误。甚至可以这样做吗?

4 个答案:

答案 0 :(得分:3)

你可以这样做:

class Laptop(Pc):
    def __init__(self, pc, battery):
        Pc.__init__(self, pc.brand, pc.processor, pc.price)
        self.battery = battery

这会从您为构造函数提供的pc参数初始化继承的属性。

如果您希望能够使用short或long方法,则应定义构造函数以获取关键字参数,然后使用if语句根据使用的形式适当调用Pc.__init__()

答案 1 :(得分:1)

python中没有内置机制来实现你想要的,所以你必须自己动手或找到第三方解决方案。

一个很好的方法是我可能会在超类上添加一个可以克隆你的对象的类方法:

Product ID

但是你可能会发现你开始遇到初始化参数的问题。我建议将class Pc: @classmethod def clone(cls, target, *extra_args, **extra_kwargs): return cls( target.brand, target.processor, target.price, *extra_args, **extra_kwargs) def __init__(self, brand, processor, price): self.brand = brand self.processor = processor self.price = price class Laptop(Pc): def __init__(self, brand, processor, price, battery): super(Laptop, self).__init__(brand, processor, price) self.battery = battery a = Pc("brand","processor","price") b = Laptop.clone(a, 'battery') print(b.battery) 所需的参数保持在最低限度,然后再配置必要的属性:

__init__()

答案 2 :(得分:1)

这个

有几种选择
  1. 如果您想要保持当前行为,在添加新行为时,您可以使用* arg,例如

    class Laptop(Pc):
        def __init__(self, *argv ):
            if len(argv) == 4: #the current one
                brand, processor, price, battery = argv
            elif len(argv) == 2: #the new one
                pc, battery = argv
                brand, processor, price = pc.brand, pc.processor, pc.price
            else:
                raise TypeError
        Pc.__init__(self,brand,processor,price)
        self.battery = battery    
    

    并使用简单的

    a = Pc("brand","processor","price")
    b = Laptop(a, "battery")
    
  2. 制作一个处理这种情况的类方法

    class Laptop(Pc):
    
        def __init__(self,brand,processor,price, battery):
            Pc.__init__(self,brand,processor,price)
            self.battery = battery
    
        @classmethod
        def from_pc_and_battery(cls, pc, battery):
            return cls( pc.brand, pc.processor, pc.price, battery)
    

    使用这个,就像这样

    a = Pc("brand","processor","price")
    b = Laptop.from_pc_and_battery(a, "battery")
    

答案 3 :(得分:0)

你以某种黑客的方式做到这一点:

import copy
a = Pc("brand","processor","price")
b = copy.deepcopy(a)
b.__class__ = Laptop()
b.battery = battery