¿Debo, y cómo, agregar métodos a int en python?

(Esta es una pregunta relacionada con el aprendizaje, así que cualquier consejo sobre por qué debo hacer o no hacer algo, así como los recursos recomendados para mejorar estas cosas, es más que bienvenido).

Estoy tratando de aprender sobre la POO en python, y he hecho una clase simple de “Tiempo” como esta:

class Time(object): """A time representation.""" def __init__(self, hours=0, minutes=0, seconds=0): self.hours = hours self.minutes = minutes self.seconds = seconds def __int__(self): return self.hours * 3600 + self.minutes * 60 + self.seconds 

Ahora, ese método __ int __ me permite obtener un int de mis instancias de “Tiempo” que representan el tiempo (pero en segundos) cuando lo hago int(Time(3, 4, 5)) . Por cierto, me parece que es algo increíble. Pero, para usar esto, sería bueno saber cómo hacer que un “int” tenga un nuevo método que devuelva un objeto “Time”, por lo que se podría hacer algo así como 3643.time() .

¿Por qué? Por varias razones:

  1. Porque de esa manera aprendo lo que para mí es como la magia negra en este momento. (estas cosas subrayadas que hacen que las cosas sucedan … y cosas relacionadas)

  2. Porque no sé por qué no debería. (asi que dime por favor)

Supongo que podría hacer algo como lo siguiente fuera de cualquier clase:

 def time(seconds): """Return an HH:MM:SS stamp of "seconds", where "seconds" should be an int.""" hours, minutes = 0, 0 if seconds >= 3600: hours, seconds = divmod(int, 3600) if seconds >= 60: minutes, seconds = divmod(int, 60) return "{:02d}:{:02d}:{:02d}".format(hours, minutes, seconds) 

Pero eso no parece relacionarse lo suficiente con estos objetos, no parece estar muy orientado a objetos … Entonces, creo que tal vez haya una mejor manera de abordar este tipo de cosas.

No, realmente no puedes agregar métodos a int. Podría __int__ subclase de int, y devolverlo desde su método __int__ , pero eso no le ayudará mucho, ya que al llamar a int() se devolverá un int regular.

Tu idea de usar una función regular para volver a Time() es correcta, pero podría ser bueno convertirlo en un método de clase, así que es un poco más obvio cómo se relaciona:

 class Time(object): @classmethod def from_seconds(cls, seconds): _hours, _minutes, _seconds = ... return cls(_hours, _minutes, _seconds)