在python中设计类

时间:2010-12-19 08:22:35

标签: python

我正在设计一个类,它可以生成cpu使用,磁盘使用,内存使用等信息...... 对于3个系统,假设有许多工作站和工作站的数据中心有许多PC。因此,所有3个级别(数据中心,工作站,Pcs)都需要CPU使用率和其他参数。请建议以下类设计正确或如何设计

修改

class Datacenters:
 def __init__(self,name,location,cpu,mem):
  self.name=name
  self.location=location
  self.cpu=cpu
  self.mem=mem

 def  getparam(self):
  return self.name,self.location ,self.cpu,self.mem

 def  getname(self):
  return self.name

class WS(Datacenters):
 def __init__(self,name,location,cpu,mem,obj):
  #datacentername = Datacenters.__init__(self) #To which data center it is associated
  obj.getname() #To which data center it is associated

  self.name=name
  self.location=location
  self.cpu=cpu
  self.mem=mem

def  getparam(self,obj):
  return self.name,self.location ,self.cpu,self.mem,obj.getname()

def  getpcname(self):
  return self.name

class Pcs(WS):
 def __init__(self,name,location,cpu,mem,obj):
  obj.getpcname() #To which WS it is  associated
  self.name=name
  self.location=location
  self.cpu=cpu
  self.mem=mem

 def  getparam(self,obj):
  return self.name,self.location ,self.cpu,self.mem,obj.getpcname()


a = Datacenters("dc1","Bl1",20,30)
print a.getparam()
b = WS("WS1","Bl1",20,30,a)
print b.getparam(a)
c = Pcs("PC1","Bl1",20,30,b)
print c.getparam(b)

4 个答案:

答案 0 :(得分:3)

一些建议:

  • 使用4个空格的缩进
  • 使用properties代替getter,为所有参数提供单个属性,而不是单个属性(因为参数可能稍后添加或通过子类化添加)。为了使用属性,从object(新样式类)
  • 派生基类
  • 使用单数类名称“Datacenter”而不是“Datacenters”,因为单个实例不代表多个数据中心,对吗?
  • 请勿调用参数“obj”
  • 那么,数据中心有CPU吗?工作站是数据中心,获取数据中心作为参数? Whaaat?

这些要点主要是关于编码风格。我无法真正帮助您处理您的用例 - 希望您明白您的类层次结构是完全错误的?!

答案 1 :(得分:3)

你的大部分代码都毫无意义。我删除了不需要的行:

class Datacenter:
    def __init__(self,name,location,cpu,mem):
        self.name=name
        self.location=location
        self.cpu=cpu
        self.mem=mem

class Workstation:
    def __init__(self,name,location,cpu,mem,datacenter):
        self.name=name
        self.location=location
        self.cpu=cpu
        self.mem=mem
        self.datacenter=datacenter

class Computer:
    def __init__(self,name,location,cpu,mem,workstation):
        # This line does nothing:
        self.name=name
        self.location=location
        self.cpu=cpu
        self.mem=mem
        self.workstation=workstation

您不需要在Python中编写访问器方法。只需直接访问属性即可。 此外,obj.getname()行没有做任何事情。

当然,正如其他人所指出的,数据中心什么时候有CPU?计算机与工作站的位置不同吗?然后它不需要位置。您的代码可能看起来像这样:

class Datacenter:
    def __init__(self,name,location):
        self.name=name
        self.location=location

class Workstation:
    def __init__(self,name,location,datacenter):
        self.name=name
        self.location=location
        self.datacenter=datacenter

class Computer:
    def __init__(self,name,cpu,mem,workstation):
        # This line does nothing:
        self.name=name
        self.cpu=cpu
        self.mem=mem
        self.workstation=workstation

   def location(self):
       return self.workstation.location

   def datacenter(self):
       return self.workstation.datacenter

答案 2 :(得分:2)

这甚至意味着什么?

   class WS(Datacentres):
      name
      location
      cpu
      mem

无论如何,你的设计听起来都不对。如果数据中心有工作站,为什么工作站会从数据中心进入?工作站不是数据中心。

http://en.wikipedia.org/wiki/Has-a

答案 3 :(得分:1)

您不应该以这种方式使用继承,因为Pcs不是WSWS不是Datacentres

您可以创建一个包含所有字段(name,cpu ...)的类UnitInfo,并在DataCentresWS,{{1}中使用该类的实例因为这里有“有”关系(而不是“是”)。

或者,创建一个名为Pcs(或Unit的类,我不明白为什么使用复数形式),并继承该类。 Units“有”“名称,”cpu-usage“等等。”Pc“是Unit。但是Unit可能不是该类的适当名称。