
Olá habrozhiteli! Recentemente, lançamos um novo livro sobre Python. Oferecemos a você que se familiarize imediatamente com o material de apuração de fatos.
Trecho. 7.4 Usando IDLE
Como o IDLE inclui o REPL, você pode inserir o código acima e analisá-lo diretamente no REPL. No entanto, você também pode escrever, executá-lo e analisá-lo no REPL. Para experimentar esse recurso, abra um novo arquivo e inclua o seguinte código:
name = "Matt" first = name age = 1000 print(id(age)) age = age + 1 print(id(age)) names = [] print(id(names)) names.append("Fred") print(id(names))
Salve o código em um arquivo chamado iden.py. Execute o arquivo Em IDLE, pressione a tecla F5 para fazer isso. Quatro números serão exibidos no REPL. Os dois primeiros serão diferentes; isso sugere que o número inteiro é imutável. Os dois últimos números são os mesmos. Isso ocorre porque, apesar de alterar a lista de nomes, o identificador permanece o mesmo. Em geral, esse fato não é nada fundamentalmente novo.
Agora, o mais interessante: se você digitar o comando dir () no REPL, ele exibirá uma lista de variáveis. Você verá que variáveis globais do iden.py estão agora disponíveis.
O REPL no IDLE fornece acesso a todas as variáveis globais. Você pode procurar nomes e nomes e até mesmo chamar funções ou métodos - por exemplo, names.append ("George").
Tendo a oportunidade de estudar os resultados do código acabado de executar, você pode analisar rapidamente o código e experimentar com ele. Os desenvolvedores experientes em Python costumam escrever código no REPL, colá-lo em um arquivo, executá-lo novamente, escrever um novo código no REPL e continuar a escrever o código dessa maneira.
Trecho. 22. Subclassificação
Além de agrupar estado e operações, as classes também fornecem reutilização de código. Se você já tem uma classe e precisa de outra com comportamento ligeiramente diferente, uma maneira de reutilizar é subclassificar. A classe da qual a subclasse é executada é chamada de superclasse (outro nome comum para a superclasse é a classe pai).
Suponha que você queira criar uma cadeira que possa acomodar seis esquiadores. Para criar a classe Chair6, que simula uma cadeira para seis pessoas, uma versão mais especializada do Chair, você pode usar a subclasse. As subclasses permitem ao programador herdar os métodos das classes pai e substituir os métodos que precisam ser alterados.
A seguir está a classe Chair6, que é uma subclasse de CorrectChair:
>>> class Chair6(CorrectChair): ... max_occupants = 6
Nota: a classe pai de CorrectChair é colocada entre parênteses após o nome da classe. Observe que o Chair6 não define um construtor em seu corpo, no entanto, você pode criar instâncias da classe:
>>> sixer = Chair6(76)
Como o Python cria um objeto se nenhum construtor está definido na classe? Aqui está o que acontece: quando o Python pesquisa o método .__ init__, a pesquisa começa com o Chair6. Como a classe Chair6 contém apenas o atributo max_occupants, o Python não encontrará o método .__ init__ aqui. Mas como Chair6 é uma subclasse de CorrectChair, ele tem o atributo __bases__ que lista as classes base resumidas na tupla:
>>> Chair6.__bases__ (__main__.CorrectChair,)
Em seguida, o Python procura o construtor nas classes base. Ele encontra o construtor no CorrectChair e o usa para criar uma nova classe.
A mesma pesquisa ocorre ao chamar .load para uma instância. A instância não possui um atributo correspondente ao nome do método, portanto, o Python verifica a classe da instância. O Chair6 também não possui um método .load, portanto, o Python está procurando um atributo na classe base CorrectChair. Aqui, o método .load é chamado com um valor muito grande, resultando em um erro ValueError:
>>> sixer.load(7) Traceback (most recent call last): File "/tmp/chair.py", line 30, in <module> sixer.load(7) File "/tmp/chair.py", line 13, in load new_val = self._check(self.count + number) File "/tmp/chair.py", line 23, in _check number)) ValueError: Invalid count:7
O Python encontra o método na classe base, mas chamar o método ._check resulta em um erro ValueError.
22.1 Contando paradas
Às vezes, o esquiador não consegue subir adequadamente no elevador. Nesses casos, o operador diminui a velocidade ou para o elevador para ajudar o esquiador. Podemos usar o Python para criar uma nova classe que contará o número de tais paradas.
Suponha que cada chamada para .load chame uma função que retorne uma indicação lógica de uma parada ou não. Nos parâmetros da função, o número de esquiadores e o objeto da cadeira são transferidos.
A seguir está a classe que obtém a função is_stalled no construtor. Esta função será chamada sempre que .load for chamada:
>>> class StallChair(CorrectChair): ... def __init__(self, id, is_stalled): ... super().__init__(id) ... self.is_stalled = is_stalled ... self.stalls = 0 ... ... def load(self, number): ... if self.is_stalled(number, self): ... self.stalls += 1 ... super().load(number)
Para criar uma instância desta classe, você deve fornecer a função is_stalled. A seguinte função simples gera paradas em 10% dos casos:
>>> import random >>> def ten_percent(number, chair): ... """Return True 10% of time""" ... return random.random() < .1
Agora você pode criar uma instância especificando a função ten_percent como o parâmetro is_stalled:
>>> stall42 = StallChair(42, ten_percent)
22.2 super
Lembre-se de que o StallChair define seu próprio método .__ init__, chamado quando uma instância é criada. Nota: a primeira linha do construtor se parece com isso:
super().__init__(id)
Quando você chama super dentro do método, obtém acesso à classe pai correta.
Uma linha no construtor permite que você chame o construtor CorrectChair. Em vez de repetir a lógica de atribuir os atributos id e count, você pode usar a lógica da classe pai. Como o StallChair possui atributos adicionais que devem ser definidos para a instância, isso pode ser feito após a chamada do construtor pai.
O método .load também contém uma chamada para super:
def load(self, number): if self.is_stalled(number, self): self.stalls += 1 super().load(number)
No método .load, você chama a função is_stalled para determinar se o elevador parou e depois transfere o controle da funcionalidade .load original do CorrectChair usando super.
A colocação de código comum em um local (na classe base) reduz o número de erros e a duplicação de código.
Sobre o autor
Matt Harrison usa Python desde 2000. Ele lidera a MetaSnake, uma empresa de consultoria e treinamento corporativo em Python e teoria de análise de dados. No passado, ele trabalhou nas áreas de pesquisa, gerenciamento de montagem e testes, inteligência de negócios e armazenamento de dados.
Ele fez apresentações e palestras de treinamento em conferências como Strata, SciPy, SCALE, PyCON e OSCON, bem como em conferências de usuários locais. A estrutura e o material deste livro são baseados em sua experiência prática no ensino de Python. Matt publica periodicamente informações úteis relacionadas ao Python no Twitter (@__mharrison__).
Editores científicos
Roger A. Davidson é atualmente o reitor do Departamento de Matemática da American River College em Sacramento, Califórnia. Sua tese de doutorado foi escrita sobre o tópico de engenharia aeroespacial, mas ele também possui diplomas em educação em ciência da computação, engenharia elétrica e de sistemas e também recebeu recentemente um certificado em ciência de dados (que começou seu fascínio por Python). Ao longo de sua carreira, Roger trabalhou para a NASA, para empresas da Fortune 50, startups e faculdades comunitárias. Ele está entusiasmado com educação, ciência (não apenas processamento de dados), tortas de amora e liderança de equipes heterogêneas na solução de grandes problemas.
Andrew McLaughlin (AndrewMcLaughlin) - programador e designer, administrador de sistemas pela manhã e um homem de família à tarde. Devido à sua atenção aos detalhes, ele está envolvido em programação web desde 1998. Vencedor da George Fox University Honors, Andrew é formado em sistemas de gerenciamento e informação. Em seu tempo livre, ele faz acampamentos com a esposa e dois filhos, e às vezes também trabalha em uma oficina de carpintaria (todos os dedos ainda estão no lugar). Leia seus posts no Twitter: @amclaughlin.
»Mais informações sobre o livro podem ser encontradas no
site do editor»
Conteúdo»
TrechoPara Habrozhitelami, um desconto de 20% no cupom -
Python .