具有子属性的Python类(初学者)

时间:2013-09-20 15:53:36

标签: python

我是Python的初学者,我正在寻找一种方法来创建一个带有子属性的类,这样我就可以将公共属性组合在一起并引用主类。例如:

class RoadNetwork(object): # This is the main class
    def __init__(self):
        self.Types = ['Dirt', 'Gravel', 'Pavement']

    class HighWay(self): # This is the subclass
        def __init__(self):
            MaxSpeed = 55
            MinSpeed = 35
            Type = self.Types[2]


>>> roads = RoadNetwork()
>>> roads.Types
['Dirt', 'Gravel', 'Pavement']
>>> roads.HighWay.MaxSpeed
55
>>> roads.HighWay.MinSpeed
35
>>> roads.HighWay.Type
'Pavement'
>>>

2 个答案:

答案 0 :(得分:1)

你遗产错了。这就是你应该如何声明一个类层次结构:

class RoadNetwork(object):  # This is the main class
    def __init__(self):
        self.types = ['Dirt', 'Gravel', 'Pavement']

class HighWay(RoadNetwork): # This is the subclass
    def __init__(self):
        RoadNetwork.__init__(self)
        self.maxSpeed = 55
        self.minSpeed = 35
        self.roadType = self.types[2]

例如:

road = RoadNetwork()
road.types
=> ['Dirt', 'Gravel', 'Pavement']

highway = HighWay()
highway.maxSpeed
=> 55
highway.minSpeed
=> 35
highway.roadType
=> 'Pavement'

答案 1 :(得分:0)

我并不认为继承是你正在寻找的,因为HighWay是一种道路,但它不是一种RoadNetwork。据我了解,您只需要RoadNetwork的单个实例,并且您的道路类型都会引用同一个RoadNetwork实例。

我还建议将一些实例变量移动到类属性中。例如,HighWay的所有实例都具有相同的roadType,因此它们不会在实例级别分配,而是共享类值。

执行此操作的最简单方法可能是让所有道路类型引用全局变量roads,但通常会以这种方式使用全局变量。更好的解决方案是使用类工厂,将引用传递给RoadNetwork实例:

def highway_factory(roads):
    class HighWay(object):
        max_speed = 55
        min_speed = 35
        road_type = roads.types[2]
    return HighWay

class RoadNetwork(object):
    def __init__(self):
        self.types = ['Dirt', 'Gravel', 'Pavement']
        self.HighWay = highway_factory(self)

示例:

>>> roads = RoadNetwork()
>>> roads.types
['Dirt', 'Gravel', 'Pavement']
>>> roads.HighWay.max_speed
55
>>> roads.HighWay.min_speed
35
>>> roads.HighWay.road_type
'Pavement'