Articles of herencia múltiple

¿Por qué no puedo crear un dictado predeterminado ordenado al heredar OrderedDict y defaultdict?

Mi primer bash de combinar las características de dos diccionarios en el módulo de collections fue crear una clase que los hereda: from collections import OrderedDict, defaultdict class DefaultOrderedDict(defaultdict, OrderedDict): def __init__(self, default_factory=None, *a, **kw): super().__init__(default_factory, *a, **kw) Sin embargo, no puedo asignar un artículo a este diccionario: d = DefaultOrderedDict(lambda: 0) d[‘a’] = 1 […]

¿Por qué OrderedDict no usa super?

Podemos crear un OrderedCounter trivial utilizando la herencia múltiple: >>> from collections import Counter, OrderedDict >>> class OrderedCounter(Counter, OrderedDict): … pass … >>> OrderedCounter(‘Mississippi’).items() [(‘M’, 1), (‘i’, 4), (‘s’, 4), (‘p’, 2)] Corríjame si me equivoco, pero esto se basa fundamentalmente en el hecho de que Counter usa super : class Counter(dict): def __init__(*args, **kwds): […]

Subclasificación de OrderedDict y defaultdict

Raymond Hettinger mostró una manera realmente genial de combinar clases de colección: from collections import Counter, OrderedDict class OrderedCounter(Counter, OrderedDict): pass # if pickle support is desired, see original post Quiero hacer algo similar para OrderedDict y defaultdict. Pero, por supuesto, defaultdict tiene una firma __init__ diferente, por lo que requiere trabajo adicional. ¿Cuál es […]

Python: Modificar los argumentos pasados ​​antes de la inicialización de la instancia de clase

Estoy experimentando con formas de implementar un sistema simplificado de reescritura de términos (TRS) / sistema de álgebra simbólica en Python. Para esto realmente me gustaría poder interceptar y modificar los operandos en casos particulares durante el proceso de creación de instancias de instancia de clase. La solución que se me ocurrió fue crear una […]

Herencia múltiple en python3 con diferentes firmas

Tengo tres clases: A , B y C C hereda de A y B (en este orden). Las firmas constructoras de A y B son diferentes. ¿Cómo puedo llamar a los métodos __init__ de ambas clases para padres? Mi esfuerzo en el código: class A(object): def __init__(self, a, b): super(A, self).__init__() print(‘Init {} with arguments […]

Django – eliminando objeto, manteniendo padre?

Tengo la siguiente situación de herencia de varias tablas: from django.db import Models class Partner(models.Model): # this model contains common data for companies and persons code = models.CharField() name = models.CharField() class Person(Partner): # some person-specific data ssn = models.CharField() class Company(Partner): # some company-specific data tax_no = models.CharField() ¿Cómo puedo convertir una instancia de […]

¿Cómo funciona realmente el super () de Python, en el caso general?

Hay una gran cantidad de excelentes recursos en super() , incluida esta gran publicación de blog que aparece mucho, así como muchas preguntas sobre el desbordamiento de stack. Sin embargo, siento que todos ellos no llegan a explicar cómo funciona en el caso más general (con gráficos de herencia arbitrarios), así como lo que está […]

¿Por qué tengo que especificar mi propia clase cuando uso super () y hay una manera de evitarlo?

Al usar el super() Python para hacer el encadenamiento de métodos, debe especificar explícitamente su propia clase, por ejemplo: class MyDecorator(Decorator): def decorate(self): super(MyDecorator, self).decorate() Tengo que especificar el nombre de mi clase MyDecorator como un argumento para super() . Esto no es SECO. Cuando renombre mi clase ahora tendré que renombrarla dos veces. ¿Por […]

__bases__ no funciona! ¿Que sigue?

El siguiente código no funciona en Python 3.x, pero solía trabajar con clases de estilo antiguo: class Extender: def extension(self): print(“Some work…”) class Base: pass Base.__bases__ += (Extender,) Base().extension() La pregunta es simple: ¿Cómo puedo agregar dinámicamente (en tiempo de ejecución) una súper clase a una clase en Python 3.x? ¡Pero estoy lista la respuesta […]

Sqlalchemy: evitar la herencia múltiple y tener una clase base abstracta

Así que tengo un montón de tablas que usan SQLAlchemy que se modelan como objetos que heredan del resultado a una llamada a declarative_base() . Es decir: Base = declarative_base() class Table1(Base): # __tablename__ & such here class Table2(Base): # __tablename__ & such here Etc. Luego quise tener alguna funcionalidad común disponible para cada una […]