我做了两个班,父母和孩子。我想知道的是,是否可以使用父类初始化子类。这是我的代码:
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")
当我用我的代码尝试这个时,我收到一个错误。甚至可以这样做吗?
答案 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)
这个
有几种选择如果您想要保持当前行为,在添加新行为时,您可以使用* 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")
制作一个处理这种情况的类方法
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