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

Python - how to correctly set up hierarchy of classes?

我有以下代码:

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'    

如何正确设置 class,以便一旦我 运行 主代码,我就能得到我需要的东西?我什至不确定我是否完全正确地使用了 super() 。

非常感谢你的帮助。

我认为你根本不需要子类化。

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

组合 classes 有两种不同的方法:继承和组合。

继承类似于:有一个 class Computer,它被 LaptopPC 子class继承或继承。

组合是这样的:有class Computer,其中包含CPURAM等组件

对于您的示例,您希望使用组合。有关组合的代码示例,请参阅@Cyphase 的回答。

我觉得你把继承概念和组合概念混在一起了。

假设您有两个 classes A 和 B。 如果 class A 继承了 B,那么 "A is a B" 继承了更多的东西。例如,一个 FrenchPerson class 可以继承一个 Human class.

如果 class A 组成 B,则 A 由 B 组成。例如,您的计算机是由 CPU 组成的,因此

你应该有类似的东西

class Computer()
    def __init__(self, name, cpu):
        self.name = name
        self.cpu = cpu

haaa 我回答得太慢了:D

您构建的层次结构中的语义问题是 CPU 实际上不是计算机类型,它是 part 计算机,因此您应该将其定义为 attribute 而不是子类型:

class Computer(object):
    def __init__(self, name, cpu):
        self.name = name
        self.cpu = cpu

类 在层次结构上相关,即使它们代表不同的事物并且具有帮助我们识别它们的独特属性,也应该有一些共同点。例如;汽车是车辆,卡车也是车辆,因此车辆可以定义为汽车和卡车的 super class。虽然它们看起来完全不同,但它们作为车辆有一些共同点:enginewheeltransmission etc .

回到你的问题,CPU 基本上是计算机的心脏,所有类型的计算机都需要的东西 所以它应该是继承的东西来自超级 class 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关于class继承。我强烈建议阅读一次。