我有以下代码:
class Computer(object):
def __init__(self, name):
self.name = name
class CPU(Computer):
def __init__(self):
super(CPU, self).__init__(name)
self.name = name
mycomputer = Computer('My Computer')
mycomputer.CPU.name = 'Intel'
print mycomputer.name, mycomputer.CPU.name
我想得到以下内容:
My Computer, Intel
但我收到以下错误:
AttributeError: 'Computer' object has no attribute 'CPU'
如何正确设置类,所以一旦运行主代码,我就会得到我需要的东西?我甚至不确定我是否正确使用super()。
我真的很感谢你的帮助。
答案 0 :(得分:6)
您构建的层次结构中的语义问题是CPU
实际上不是计算机类型,它是计算机的part
,因此您应该将其定义为attribute
而不是子类型:
class Computer(object):
def __init__(self, name, cpu):
self.name = name
self.cpu = cpu
层次相关的类应该有一些共同点,即使它们代表不同的东西,并且具有帮助我们识别它们的独特属性。例如;汽车是一种车辆,卡车也是一种车辆,因此车辆可以被定义为汽车和卡车的超级。虽然它们看起来完全不同,但它们有一些共同的东西:引擎, wheel ,传输等。
回到你的问题,CPU基本上是计算机的核心,所有类型的计算机都需要,所以它应该是从超类Computer
继承的东西:
class Computer(object):
def __init__(self, name, cpu):
self.name = name
self.cpu = cpu
class Laptop(Computer):
def __init__(self, name, cpu, manufacturer):
super(Laptop, self).__init__(name, cpu)
self.manufacturer = manufacturer
class AutomatedTellerMachine(Computer):
def __init__(self, name, cpu, bank):
super(AutomatedTellerMachine, self).__init__(name, cpu)
self.bank = bank
>>> macbook = Laptop('My Macbook', 'Intel', 'Apple')
>>> atm = AutomatedTellerMachine('ATM 1', 'AMD', 'Wells Fargo')
Python中有关于类继承的好read。我强烈建议您阅读一次。
答案 1 :(得分:3)
我认为你根本不想进行子类化。
class Computer(object):
def __init__(self, name, cpu):
self.name = name
self.cpu = cpu
class CPU(object):
def __init__(self, manufacturer):
self.manufacturer = manufacturer
intel_cpu = CPU('Intel')
mycomputer = Computer('My Computer', intel_cpu)
print "{}, {}".format(mycomputer.name, mycomputer.cpu.manufacturer)
给出这个输出:
My Computer, Intel
答案 2 :(得分:3)
我认为你是继承概念和构图概念的混合物。
假设您有两个A和B类。 如果A类继承B,那么“A就是B”,其中包含更多内容。例如,FrenchPerson类可以继承Human类。
如果A类组成B,则A由B组成。例如,您的计算机是用CPU制作的
你应该有像
这样的东西class Computer()
def __init__(self, name, cpu):
self.name = name
self.cpu = cpu
haaa我太慢了回答:D
答案 3 :(得分:2)
组合类有两种不同的方法:继承和组合。
继承类似于:有一个类Computer
,它由Laptop
和PC
进行子类化或继承。
组合是这样的:有一个类Computer
,其中包含CPU
,RAM
等组件。
对于您的示例,您想要使用合成。有关合成的代码示例,请参阅@ Cyphase的答案。