Class Definition in Python Fields numerator int denominator

  • Slides: 21
Download presentation
Class Definition in Python # Fields: # numerator: int # denominator: int class Fraction.

Class Definition in Python # Fields: # numerator: int # denominator: int class Fraction. V 1: # … • There is no expicit declaration of fields (instance variables) • It is good to “anounce then” in the comments. • After “class”, defne constructor of the class • We would like to have same possibilitites as in previous versión f 1 = Fraction. V 1(5, 9) f 2 = Fraccion. V 1() F 3 = Fraction. V 1(“ 5/9”) # fraction 5/9 # fractión 0/1 by default # fraction 5/9

Constructor def __init__ (self, num=0, den=1): # fields initialization if type(num) is str: self.

Constructor def __init__ (self, num=0, den=1): # fields initialization if type(num) is str: self. num = int(num[: num. index("/")]) self. den = int(den[num. index("/")+1: ]) else: self. num = num self. den = den __init__ name of the constructor. Just one for a class (in Python arguments are more flexible). Always first parameter: self: reference to objet being created. User does not need to pass “self”:

Another example # Fields # name: string # type: string # age: int class

Another example # Fields # name: string # type: string # age: int class Pet: def __init__(self, name, type=“dog”, age=0) self. name = name self. type = type self. age = age p = Pet(“Fido”) kitty = Pet(“Garfield”, “kat”, 7)

Sum: inside calss Fraction. V 1 # sum : fraction -> fraction # returns

Sum: inside calss Fraction. V 1 # sum : fraction -> fraction # returns the sum of this fraction with the parameter def sum (self , fraction): num = self. num*fraction. den + fraction. num*self. den = self. den*fraction. den return Fraction. V 1(num, den) f 1 = Fraction. V 1(1, 2) f 2 = Fraction. V 1(5, 6) f 3 = f 1. sum(f 2) f 1 corresponds to self

accesors y mutators • Accesors: do not monify fiels Ex. : sum • Mutators:

accesors y mutators • Accesors: do not monify fiels Ex. : sum • Mutators: may modify field values • put a comment on the effect a mutator función may have on fields • Ejemplo de método mutador: simplificar una fracción • Al simplificar (eventualmente) debemos modificar numerador y denominador • Supongamos que contamos con la función mcd(i 1, i 2)

Método simplificar (mutador) # simplificar : None -> Fraccion # efecto : simplifica la

Método simplificar (mutador) # simplificar : None -> Fraccion # efecto : simplifica la fraccion , puede modificar los # valores de los campos numerador y denominador def simplificar ( self ): valor = mcd(self. numerador, self. denominador) if valor > 1: self. numerador = self. numerador/valor self. denominador = self. denominador/valor Por convención, a los métodos accesores se les pone nombre que comienza con get. A los métodos mutadores, se les pone nombre que comienza con set.

Métodos accesores para la clase Fraccion. V 1 Por convención, a los métodos accesores

Métodos accesores para la clase Fraccion. V 1 Por convención, a los métodos accesores se les pone nombre que comienza con get. A los métodos mutadores, se les pone nombre que comienza con set. # get. Numerador : None -> int # devuelve el valor del campo numerador def get. Numerador(self): return self. numerador # get. Denominador : None -> int # devuelve el valor del campo denominador def get. Denominador(self): return self. denominador

Métodos mutadores para la clase Fraccion. V 1 # set. Numerador : int ->

Métodos mutadores para la clase Fraccion. V 1 # set. Numerador : int -> None # efecto : modifica el valor del campo numerador def set. Numerador(self, numerador ): self. numerador = numerador # set. Denominador : int -> None # efecto : modifica el valor del campo denominador def set. Denominador(self, denominador ): self. denominador = denominador

Clase Fraccion. V 1 (P. 1) # Campos : # numerador : int #

Clase Fraccion. V 1 (P. 1) # Campos : # numerador : int # denominador : int class Fraccion. V 1 : # Constructor def __init__ (self, # Inicializacion self. numerador = self. denominador numerador = 0, denominador = 1): de campos numerador = denominador # get. Numerador : None -> int # devuelve el valor del campo numerador def get. Numerador ( self ): return self. numerador

Clase Fraccion. V 1 (P. 2) # get. Denominador : None -> int #

Clase Fraccion. V 1 (P. 2) # get. Denominador : None -> int # devuelve el valor del campo denominador def get. Denominador (self): return self. denominador # set. Numerador : int -> None # efecto : modifica el valor del campo numerador def set. Numerador (self, numerador): self. numerador = numerador # set. Denominador : # efecto: modifica def set. Denominador self. denominador int -> None el valor del campo denominador (self, denominador): = denominador

Clase Fraccion. V 1 (P. 3) # to. String : None -> str #

Clase Fraccion. V 1 (P. 3) # to. String : None -> str # devuelve un string con la fraccion def to. String ( self ): return str(self. numerador)+"/"+str(self. denominador) # suma : fraccion -> fraccion # devuelve la suma de la fraccion con otra fraccion def suma (self, fraccion): num = self. numerador*fraccion. denominador + fraccion. numerador*self. denominador den = self. denominador*fraccion. denominador return Fraccion. V 1(num, den)

Clase Fraccion. V 1 (P. 4) # mcd: int -> int # devuelve maximo

Clase Fraccion. V 1 (P. 4) # mcd: int -> int # devuelve maximo comun divisor entre numeros x e y # ejemplo : mcd (12 , 8) devuelve 4 global mcd def mcd(x, y): if x == y: return x elif x > y: return mcd (x-y, y) else : return mcd (x, y-x) # Test assert mcd (12 , 8) == 4

Clase Fraccion. V 1 (P. 5) # simplificar : None -> Fraccion # efecto

Clase Fraccion. V 1 (P. 5) # simplificar : None -> Fraccion # efecto : simplifica la fraccion , puede modificar los # valores de los campos numerador y denominador def simplificar ( self ): valor = mcd( self. numerador, self. denominador ) if valor > 1: self. numerador = self. numerador / valor self. denominador = self. denominador / valor # Tests f 1 = Fraccion. V 1(1, 2) f 2 = Fraccion. V 1(5, 6) # Test de accesores assert f 1. get. Numerador() == 1 assert f 2. get. Denominador() == 6

Clase Fraccion. V 1 (P. 6) # Test de mutadores f 2. set. Numerador

Clase Fraccion. V 1 (P. 6) # Test de mutadores f 2. set. Numerador (3) f 2. set. Denominador (4) assert f 2. get. Numerador()==3 and f 2. get. Denominador()==4 # Test de metodo suma # El siguiente test es incorrecto # assert f 1. suma(f 2) == Fraccion. V 1 (10 , 8) # El siguiente test es correcto f 3 = f 1. suma(f 2) assert f 3. get. Numerador()==10 and f 3. get. Denominador()==8 # Test de metodo to. String assert f 3. to. String() == "10/8" # Test de metodo simplificar f 3. simplificar() assert f 3. get. Numerador()==5 and f 3. get. Denominador()==4

Fraccion. V 2: una versión más segura • Podemos crear una nueva clase Fraccion.

Fraccion. V 2: una versión más segura • Podemos crear una nueva clase Fraccion. V 2 que no tiene métodos mutadores. • Para ello, creamos nuevos métodos accesadores, en donde el resultado se almacena en un nuevo objeto de la misma clase (y/o se eliminan métodos mutadores). • Además, para evitar que un usuario fuera de la clase pueda modificar los campos de un objeto, en Python se pueden definir con nombres que comiencen con los caracteres __ (dos caracteres subrayado), y esto los hace inaccesibles fuera de la clase. • Si uno intenta modificar un campo que comienza con __, Python arroja el error Attribute. Error.

Clase Fraccion. V 2 (P. 1) # Campos : # numerador : int #

Clase Fraccion. V 2 (P. 1) # Campos : # numerador : int # denominador : int class Fraccion. V 2 : # Constructor def __init__(self, numerador=0, denominador=1): # Inicializacion de campos # campos invisibles al usuario self. __numerador = numerador self. __denominador = denominador # get. Numerador : None -> int # devuelve el valor del campo numerador def get. Numerador ( self ): return self. __numerador

Clase Fraccion. V 2 (P. 2) # get. Denominador : None -> int #

Clase Fraccion. V 2 (P. 2) # get. Denominador : None -> int # devuelve el valor del campo denominador def get. Denominador ( self ): return self. __denominador # to. String : None -> str # devuelve un string con la fraccion def to. String ( self ): return str(self. __numerador)+"/"+str(self. __denominador) # suma : Fraccion -> Fraccion # devuelve la suma de la fraccion con otra fraccion def suma(self, fraccion ): num = self. __numerador*fraccion. __denominador+ fraccion. __numerador*self. __denominador den = self. __denominador*fraccion. __denominador return Fraccion. V 2(num, den)

Clase Fraccion. V 2 (P. 3) # mcd: int -> int # devuelve el

Clase Fraccion. V 2 (P. 3) # mcd: int -> int # devuelve el maximo comun divisor entre dos numeros x e y # ejemplo : mcd (12 , 8) devuelve 4 global mcd def mcd(x, y): if x == y: return x elif x > y: return mcd (x-y, y) else : return mcd (x, y-x) # Test assert mcd(12, 8) == 4

Clase Fraccion. V 2 (P. 4) # simplificar : None -> Fraccion # devuelve

Clase Fraccion. V 2 (P. 4) # simplificar : None -> Fraccion # devuelve la fraccion simplificada def simplificar ( self ): valor = mcd(self. __numerador , self. __denominador ) num = self. __numerador / valor den = self. __denominador / valor return Fraccion. V 2(num, den ) # Tests f 1 = Fraccion. V 2 (1, 2) f 2 = Fraccion. V 2 (3, 4) # Test de accesores assert f 1. get. Numerador() == 1 assert f 2. get. Denominador() == 4 #

Clase Fraccion. V 2 (P. 5) # Test de metodo suma f 3 =

Clase Fraccion. V 2 (P. 5) # Test de metodo suma f 3 = f 1. suma(f 2) assert f 3. get. Numerador()==10 and f 3. get. Denominador()==8 # Test de metodo to. String assert f 3. to. String() == "10/8" # Test de metodo simplificar f 4 = f 3. simplificar() assert f 4. get. Numerador()==5 and f 4. get. Denominador()==4

Para la próxima clase (martes) Leer capítulo 16 del apunte

Para la próxima clase (martes) Leer capítulo 16 del apunte