2013-09-20 4 views
1

Я начинаю в 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

Продолжайте читать. Концепция, которую вы используете, - это «композиция». – Joe

ответ

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' 
+0

Это очень остро. благодаря – orange

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' 
+0

Невозможно предотвратить создание второго объекта с классом HighWay и вызвать свойства HighWay через класс дороги? – orange

+0

@orange Я думаю, вы смешиваете два разных понятия: наследование и состав. Один из вариантов - сделать так, как я сделал в своем ответе, создать иерархию классов и поместить «общие» атрибуты в суперкласс. Другим вариантом было бы иметь отдельный объект HigWay и объявить атрибут типа HighWay в классе RoadNetwork, но вы не будете объявлять HighWay _inside_ RoadNetwork, и HighWay не расширит RoadNetwork –

+0

@orange Теперь, отвечая на ваш комментарий: вы не _have to_ создать объект RoadNetwork, просто создать экземпляр объекта HighWay, и он получит доступ к его атрибутам суперкласса: HighWay будет иметь доступ к атрибутам обоих классов, то есть мы можем назвать свойства дороги через шоссе, а не другие путь вокруг –

Смежные вопросы