Pular para o conteúdo

Programação para scripts

Recursos extensos relacionados a Python podem ser encontrados em http://www.python.org. Esta seção destina-se a ser uma introdução muito breve à linguagem para ajudar o usuário a ler e compreender esta seção do manual.

Python

Python é uma linguagem de scripting. Os scripts são interpretados diretamente pelo motor Python, sem a necessidade de etapas de compilação e vinculação comuns a linguagens compiladas, como C ou Java, de modo que a edição e a execução podem ser realizadas diretamente no Aimsun Next. Outras vantagens do Python em relação ao C++ incluem o fato de não haver necessidade de se preocupar com ponteiros e gerenciamento de memória.

Uma característica do Python que pode causar problemas, particularmente para programadores vindos de outras linguagens menos rigorosas, é a importância da indentação para a estrutura do programa. Enquanto outras linguagens usam chaves, {}, o Python depende de indentação estrita para delimitar seções de código, finais de laços etc. Pelo lado positivo, isso em teoria pelo menos torna o código mais legível, particularmente entre autores.

Noções básicas

Qualquer coisa à direita de um hash (às vezes chamado de pound sign) é um comentário e não será interpretada na execução.

# This is a comment. Python will not attempt to interpret this
# print "Hello World"
# nothing happens, the print statement is behind a comment

Não há necessidade de declarar uma variável: ela é criada ao atribuir um valor. Além disso, Python é uma linguagem com tipagem dinâmica, portanto diferentes tipos de dados podem ser atribuídos à mesma variável.

myInteger = 42 # an integer
myString = "Hello World" # a string
myPi = 3.142 # a float
myEmpty = None # a null
myInteger = myPi # now myInteger is a float

Python contém as seguintes estruturas básicas de dados:

  • Números, incluindo inteiros e ponto flutuante.
  • Strings, delimitadas por " " ou ' ', e incluindo caracteres especiais, por exemplo \n para iniciar uma nova linha.
  • Boolean, True ou False.
  • Listas, por exemplo, myList = [item1, item2, item 3], em que os itens são acessados por índice no intervalo de 0 a (n-1); por exemplo, myList[1] retornaria item2.
  • Dicionários, nos quais os valores são armazenados com uma chave e acessados pela chave que mapeia para o valor.

Por exemplo, o seguinte comando:

myAddresses = {'grail': 'Castle Aargh', 'arthur': 'Camelot', 'knight ni': 'shrubbery'}

criaria um mapa como segue

Key Valor
grail Castelo Aargh
arthur Camelot
knight ni arbustos

Enquanto myAddresses['arthur'] retornaria 'Camelot'

Strings podem ser tratadas como listas de caracteres. As principais operações que funcionarão com qualquer lista, mas são mais úteis para strings, são:

  • myString = myString1 + myString2 : Cria myString como uma concatenação de duas strings.
  • myString[i] : Retorna o caractere no índice i.
  • myString[i,j] : Retorna uma substring do índice i até j-1.
  • len(myString) :Retorna o comprimento de myString.

Conceitos de orientação a objetos

Esta é uma introdução geral, e de forma alguma completa, aos conceitos orientados a objetos para ajudar o usuário a ler e compreender esta seção do manual.

Classes

Uma classe é um plano, ou protótipo, que define variáveis e métodos comuns a todos os objetos de um determinado tipo. Objetos são instâncias concretas de uma classe, um conjunto de métodos e atributos relacionados.

Exemplos de classes e objetos potenciais são fornecidos abaixo:

Classe Objetos
Tipo de veículo car, lgv, hgv, bus, coach
Tipo de carro focus, golf, mini
Carro chittyChittyBangBang, knight 2000, M_33EJB

Observe a convenção de nomenclatura de classes com a primeira letra em maiúscula e objetos com a primeira letra em minúscula.

O que constitui uma classe e o que constitui um objeto pode ser específico da aplicação. A tabela acima mostra como um esquema de classes pode ser usado para descrever tipos de veículos, subtipos de um tipo de veículo e, por fim, veículos específicos.

Atributos

Atributos são valores que definem o objeto. Os atributos são comuns a todos os objetos da mesma classe, embora seus valores sejam diferentes

Classe Atributos
Veículo route, start_time
Tipo de veículo travel_mode, pcus
PrivateCarType fabricante, modelo, peso, potência
IndividualCar owner, passengers, registration_number, color, age

Os atributos de um objeto, se publicamente acessíveis, podem ser acessados pela convenção object.attribute, por exemplo, para obter a idade de um carro específico, usaríamos M_33EJB.age, ou para encontrar o peso de um Mini usaríamos mini.weight.

Métodos

Um método é uma função que o objeto é capaz de executar. Objetos da mesma classe compartilham os mesmos métodos de classe. Métodos podem receber vários parâmetros como entradas e frequentemente retornam um valor. Métodos podem ser usados para:

  • Obter um valor de um objeto: myCar.getNumberOfWheels().
  • Defina um valor para um objeto: myCar.setMaximumPassengers(6).
  • Fazer o objeto executar alguma operação ou cálculo:
    • myCar.accelerate(rateOfAcceleration, TargetSpeed).
    • myCar.calculateMaximumSpeed().
    • myCar.addPassengerToPassengerList("Alma Cogan").

Métodos acessíveis aos clientes (outros objetos, ou você como programador) são métodos públicos. Atributos de classe, juntamente com alguns métodos internos, muitas vezes são mantidos privados e só podem ser acessados indiretamente, por meio de um conjunto bem definido de métodos públicos que formam a interface da classe. Esses métodos públicos podem impor alguma restrição para proteger os dados do objeto contra corrupção e inconsistências.

Herança

A herança permite que novas classes herdem estado e comportamento de classes existentes, nas quais a nova classe é um subtipo lógico de sua classe pai. De sua classe pai, ela herda métodos que pode sobrescrever/reimplementar, e também atributos.

Por exemplo, um programador poderia definir classes separadas não relacionadas para descrever carros, caminhões e ônibus. No entanto, essas classes de veículos compartilham métodos e atributos comuns e, para muitos aspectos no programa, seriam tratadas da mesma forma. Portanto, elas poderiam ser modeladas com a mesma classe e simplesmente conter um atributo indicando se são um "Car", "Truck" ou "Bus", mas se quisermos oferecer métodos específicos, por exemplo, para ônibus, como pickUpPassenger(busStopNumber) então isso não seria adequado.

A herança resolve esse problema permitindo uma classe pai genérica, Veículo, a ser especificada, definindo todos os métodos comuns (eg accelerate(parameters), brake(parameters)) e atributos (maxPower, length, weight). Estes podem então ser sobrescritos nas classes filhas, de modo que o tipo de veículo ("Car", "Truck" e "Bus". ) poderia sobrescrever métodos ou atributos e fornecer funções ou valores mais apropriados; de modo semelhante, um tipo específico de veículo ( i.e. o mini) poderia especializá-los ainda mais. Eles também podem ser estendidos nas classes filhas para adicionar métodos e atributos específicos da classe. Uma classe de tipo de veículo "bus" poderia estender a classe Vehicle adicionando métodos e atributos para partida programada, tabela horária e tempos de permanência em pontos de ônibus, que seriam irrelevantes para outros tipos de veículo.