Nesta charla, aprenderemos sobre clases, construtores e herdanza en python.
Estes conceptos son realmente importantes nun programa grande onde se precisan definir diferentes tipos.
clases
As clases son esenciais na programación e non son específicas de Python. Moitos outros linguaxes de programación apoiar a noción de clases. Usamos clases para definir novos tipos de datos.
Ata agora, aprendemos sobre os tipos de datos básicos en Python como números, cadeas e booleanos. Estes son os tipos de datos básicos ou simples en Python. Tamén vimos un par de tipos de datos complexos como listas e dicionarios.
Aínda que estes tipos son moi útiles, non sempre se poden usar para modelar conceptos complexos. Por exemplo, pense na idea dun punto ou dun carro da compra. Un carro da compra non é un booleano ou unha lista. Son un tipo de datos diferente. Así, podemos usar clases para definir novos tipos para modelar conceptos reais.
Agora, imos definir un novo tipo de datos chamado punto. Este novo tipo vai ter métodos como comprobamos antes.
Así o farás:
Comezamos por definir unha clase usando a palabra clave "class" e inmediatamente despois dámoslle un nome á nosa clase.
class Point
Agora, mira a convención de nomenclatura que usei aquí. Escriba aquí a primeira letra en maiúscula, isto é o que chamamos convención de nomenclatura pascal. Esta convención é diferente da que usamos para nomear as nosas variables e funcións para as que sempre usamos letras minúsculas e separamos varias palabras mediante un guión baixo. Pero ao nomear clases, non usamos un guión baixo para separar varias palabras, senón que escribimos a primeira letra de cada palabra en maiúscula.
Despois de definir a nosa clase, úsase dous puntos o que significa que agora se define un bloque.
class Point:
def move (self):
Neste bloque, podemos definir todas as funcións ou métodos que pertencen aos puntos. Por exemplo, podemos definir unha función chamada "mover" para mover un punto. Teña en conta que tan pronto como escribamos parénteses abertos, PyCharm engade automaticamente aquí "self". Esta é unha palabra clave especial e permíteme volver a isto en breve. Imos imprimir "mover" no terminal.
print("move")
Definamos outro método como “debuxar” e imprimímolo no terminal.
def draw(self):
print("draw")
Rematamos coa definición da nosa clase de "punto". Con este novo tipo, podemos crear novos obxectos. Unha clase simplemente define o modelo ou o modelo para crear obxectos que son as instancias reais baseadas nese plano. Para crear un obxecto, escribimos o nome da nosa clase e despois chamámolo como unha función. Isto crea un novo obxecto e despois devólvoo. Despois podemos almacenar ese obxecto nunha variable. Déixame mostrarche:
Aquí definimos un "punto1" que é un punto tridimensional. Podes ver que, podemos imprimir coordenadas individuais no terminal.
Podemos usar os dous métodos "debuxar" e "mover" con este punto.
Entón, para recapitular, usamos clases para definir novos tipos e estes tipos poden ter métodos que definimos no corpo da clase. As clases poden ter atributos que podemos establecer en calquera lugar dos nosos programas.
Construtores
Ata agora, aprendemos a crear novos tipos usando clases. Agora hai un pequeno problema con esta implementación. Podemos crear un obxecto puntual sen unha coordenada x ou y usando clases e iso non é o ideal. Déixame amosarche.
Imos crear un punto e imprimilo antes de establecer a coordenada x. Ao executar o noso programa produce un erro de atributo como este:
Significa que o obxecto punto non ten ningún atributo chamado x. Agora o problema é que é posible ter un obxecto puntual sen coordenadas x ou y. Isto non ten sentido xa que sempre que falamos dun punto, necesitamos saber onde se atopa ese punto. Para resolver este problema, usamos un constructor. Un construtor é unha función que se chama no momento de crear un obxecto.
Aquí é como usamos un construtor. Primeiro, imos pasar os valores de coordenadas x e y no programa anterior.
point = Point(10, 20)
print(point.x)
Agora, necesitamos engadir un método especial nesta clase chamado constructor. A súa sintaxe é a seguinte:
def __init__(self, x, y):
init
é a abreviatura de inicializado, e esta é a función ou o método que se chama cando se crea un novo obxecto de punto. X e y engádense inmediatamente despois self
para engadir dous parámetros adicionais.
Despois diso, deberiamos mapear x e y cos valores pasados, é dicir, 10 e 20
self.x = x
self.y = y
Usan o self
para referirse ao obxecto actual e despois establecemos o atributo x ao argumento x pasado á función "x". Deste xeito, empregando init
método, podemos inicializar os nosos obxectos. Este método denomínase construtor. Imos executar o noso programa.
Agora, podemos cambiar as coordenadas x e y máis tarde. Actualicemos a coordenada x:
point = Point(10, 20)
point.x = 11
print(point.x)
Agora, a coordenada x actualízase ao valor 11.
Exercer
Aquí tes un exercicio interesante.
Quero que definas un novo tipo chamado persoa. Estes obxectos "Persoa" deben ter un "name
", así como un "talk()
”Método.
É unha tarefa sinxela e non debe levar máis dun par de minutos.
solución
Comeza definindo a clase "Persoa" así:
class Person:
self.name = name
Definiremos o construtor máis adiante. Agora, podemos crear o obxecto "Persoa". Chamémoslle Xoán
john = Person("John Smith")
print(john.name)
john.talk()
Agora, vai á primeira parte do código e crea un construtor.
def __init__(self, name):
O código final será así:
Tamén pode usar cadeas formatadas e outros conceptos xunto con clases e construtores.
Herdanza
A herdanza é outro concepto asociado ás clases que che permiten reutilizar un código.
Considere este anaco de código.
class Dog:
def walk(self):
print("walk")
Creamos unha clase "Can" cun método de "paseo". Neste método, simplemente estamos imprimindo a mensaxe de paseo no terminal. Digamos, nun programa real, hai 10 liñas de código en lugar de só unha liña aquí. No futuro, se é necesaria outra clase para ter o método "walk", teremos que repetir todo ese código. Isto non é ideal.
Na programación, temos un principio chamado DRY que é a abreviatura de non te repitas. Digamos que nalgún momento no futuro descubrimos un problema co noso método de "paseo" e se repetimos ou duplicamos este método en moitos outros lugares, teremos que volver e solucionar ese problema en cada lugar onde o duplicamos. código. Por iso en programación non debemos definir algo dúas veces.
Hai diferentes enfoques para remediar este problema pero aquí imos aprender a que é máis fácil para os principiantes e que se chama herdanza. Neste caso, crearemos outra clase "mamífero" e definiremos o noso atributo "pasear" nesa clase.
class Mammal:
def walk(self):
print("walk")
Despois de definir a nosa clase "Mamíferos", podemos usar a herdanza para pasar os atributos deste xeito:
Tanto as clases de cans como de gatos están herdando todos os métodos de clase definidos na súa clase principal. Agora, podemos engadir métodos específicos para cans como este:
class Dog:
def bark(self):
print("bark")
Remata!
Isto foi todo sobre as clases, os construtores e a reutilización do código en clases con conceptos de herdanza. Agora estamos preto do final da nosa serie. Ata este punto, deberías ser capaz de producir códigos bos, lexibles e concisos en Python.
Veremos o concepto de módulos e paquetes na próxima charla.
Deixe unha resposta