poo - programacion orientada a objetos python ejemplos pdf
Orientado a objetos o refinamientos con objetos incorporados de pitón (2)
Objetivo: Extender clases abitrarias con roles que solo son válidos en un contexto determinado.
Esto funciona:
# from https://github.com/niccokunzmann/wwp/blob/master/C_builtinTypes.py
from relative import roleOf, useRoles
@roleOf(int)
class NaturalNumber:
# int gets successor only in this module
@property
def successor(self):
return 1 + self
@roleOf(tuple)
@roleOf(list)
class MyList:
@property
def first(self):
return self[0]
@useRoles
def test():
# this is possible if we recompile the code objects
i = 1
print(type(i))
assert i.successor == 2
assert i.successor.successor == 3
assert isinstance(i, int) # EDIT3 works
# check for identity
t = (3,)
assert t.first == 3
l = list()
l.append(3)
assert l.first == 3 # this assertion fails
assert l.first == 2 + 1
if __name__ == ''__main__'':
test()
Mi problema:
EDIT2: escribí 100 líneas de código para las clases habituales de python para hacer que esto funcione, pero para builtins agregué 250 líneas y no hay una solución completa a la vista.
No puedo crear clases personalizadas para objetos incorporados como puedo con clases puras de python como enlace: A o enlace: B. Esto se debe a que el compilador los coloca en todas partes:
>>> test.__code__.co_consts
(None, 1, 2, 3, (3,), 3)
No puedo hacer el reemplazo en objetos de código con listas porque están construidos en el código.
Estas son mis preguntas porque no puedo estimarlo:
¿Cuáles son los lugares en los que tengo que buscar objetos incorporados para reemplazarlos con envoltorios para poder agregarles roles?
sería una C-extensión me ayudaría a parchear la búsqueda de atributos para que pueda hacer papeles para booleanos
¿tendré que compilar mi propia pitón para hacer que esta idea funcione?
hay alguna otra solucion?
EDIT 1
Este es uno de mis casos de uso: 1 .successor.successor == 3
. Quiero que sea fácil tener dominios pequeños que no interfieran con todo el programa = mantener las clases escasas.
Por ejemplo, quiero hacer números llamables para crear un cálculo lambda.
Quiero tener clases delgadas y, para casos de uso especiales, quiero extenderlos por roles para poder llamar a funciones personalizadas. Al final debería salir algo entre la interacción entre el contexto de datos y la programación orientada al contexto.
¿Puede proporcionar más información sobre su caso de uso? Creo que quiere ver las metaclases pero no está seguro sin más información sobre sus necesidades específicas. Y creo que hay algo incorrecto o muy inteligente si quieres reemplazar los builtins.
Creo que quieres ver las Clases base abstractas: