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
,它被 Laptop
和 PC
子class继承或继承。
组合是这样的:有class Computer
,其中包含CPU
、RAM
等组件
对于您的示例,您希望使用组合。有关组合的代码示例,请参阅@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。虽然它们看起来完全不同,但它们作为车辆有一些共同点:engine、wheel、transmission 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继承。我强烈建议阅读一次。
我有以下代码:
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
,它被 Laptop
和 PC
子class继承或继承。
组合是这样的:有class Computer
,其中包含CPU
、RAM
等组件
对于您的示例,您希望使用组合。有关组合的代码示例,请参阅@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。虽然它们看起来完全不同,但它们作为车辆有一些共同点:engine、wheel、transmission 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继承。我强烈建议阅读一次。