Python - 如何正确设置类的层次结构?

时间:2015-08-08 23:09:47

标签: python class subclass super

我有以下代码:

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()。

我真的很感谢你的帮助。

4 个答案:

答案 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,它由LaptopPC进行子类化或继承。

组合是这样的:有一个类Computer,其中包含CPURAM等组件。

对于您的示例,您想要使用合成。有关合成的代码示例,请参阅@ Cyphase的答案。