1

私は 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'
>>>
4

2 に答える 2

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'
于 2013-09-20T16:00:35.410 に答える
0

HighWay は道路の一種ですが、RoadNetwork の一種ではないため、継承はあなたが探しているものではないと思います。私が理解している限り、単一のインスタンスが必要なだけでRoadNetwork、道路の種類はすべて同じRoadNetworkインスタンスへの参照を持つことになります。

インスタンス変数の一部をクラス属性に移動することもお勧めします。たとえば、 のすべてのインスタンスはHighWay同じroadTypeであるため、インスタンス レベルで this を割り当てる代わりに、クラス値を共有します。

これを行う最も簡単な方法は、すべての道路タイプがグローバル変数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'
于 2013-09-20T16:15:44.430 に答える