2009-12-19 18 views
6

Tengo una clase A y quiero una clase B con exactamente las mismas capacidades. No puedo o no quiero heredar de B, como hacer clase B (A): pase Aún quiero que B sea idéntico a A, pero tenga un i: id diferente (A)! = Id (B) Cuidado, no estoy hablando de instancias sino de clases para clonar.¿Cómo se clona una clase en Python?

+3

herencia es la clonación de clase. Decir que no quieres heredar es una tontería. –

+2

heredar mejor que ir al territorio de meta –

+2

¿Quizás quiere poder cambiar el clon de formas que no podría hacerlo definiendo propiedades adicionales en una clase derivada (como eliminar propiedades de la clase base nocional)? – markets

Respuesta

13

Estoy bastante seguro de lo que está tratando de hacer puede ser resuelto de una manera mejor, pero aquí es algo que le da un clon de la clase con una nueva ID:

def c(): 
    class Clone(object): 
     pass 

    return Clone 

c1 = c() 
c2 = c() 
print id(c1) 
print id(c2) 

da:

4303713312 
4303831072 
+1

Esto es exactamente lo que estaba buscando. La solución es perfecta: simple y al grano. Sabía que había una solución, pero sabía que tenía que ser simple. Esta es la primera vez que hago una pregunta a SO y estoy sorprendido de cuán reactivo es, en comparación con el casi extinto comp.lanp.python. ¡Muchas gracias! – Francois

+0

que no toma una clase existente sin embargo. Parece que realmente querías un "generador de clases" que genere la misma clase cada vez. – zzzeek

+0

@Francois: ¿Por qué dices en tu pregunta "No puedo o no quiero heredar de B, como hacer clase B (A): aprobar" si ahora aceptas esta solución? –

-1

Puede clonar la clase por herencia. De lo contrario, solo está pasando una referencia a la clase en sí misma (en lugar de una referencia a una instancia de la clase). ¿Por qué querrías duplicar la clase de todos modos? Es obvio por qué querrías crear varias instancias de la clase, pero no puedo entender por qué querrías una clase duplicada. También, usted puede simplemente copiar y pegar con un nuevo nombre de la clase ...

-1
class C(object): 
    pass 

class A(C): 
    pass 

class B(C): 
    pass 
0

tal vez no he entendido usted pregunta pero ¿qué pasa envolviendo A en B?

class A: 

    def foo(self): 
     print "A.foo" 

class B: 

    def __init__(self): 
     self._i = A() 

    def __getattr__(self, n): 
     return getattr(self._i, n) 
7

Supongo que esto no es lo que quería pero es lo que la cuestión parece estar pidiendo ...

class Foo(object): 
    def bar(self): 
     return "BAR!" 

cls = type("Bar", (object,), dict(Foo.__dict__)) 

print cls 

x = cls() 
print x.bar() 
+1

Esta es la respuesta a la pregunta que pensé que estaba haciendo. Los usuarios pueden querer copiar profundamente el Foo .__ dict__, dependiendo de su uso. ¿Podría envolverlo en una función reutilizable (donde pasaría la clase anterior y el nombre de nuevo)? – markets

+0

Me pregunto por qué siempre he usado 'type .__ new __()' aquí? Lo vi por primera vez en un paquete Python particular escrito por un conocido gurú de Python y estaba usando '__new__()' por alguna razón. – zzzeek

Cuestiones relacionadas