Me gustaría ejecutar automáticamente algún código en la creación de clase que puede llamar a otros métodos de clase. No he encontrado una forma de hacerlo desde la propia declaración de clase y termino creando un @classmethod
llamado __clsinit__
y llamándolo desde el ámbito de definición inmediatamente después de la declaración de clase. ¿Hay algún método que pueda definir para que se llame automáticamente después de crear el objeto de la clase?Llamar a un método de clase al crear las clases de Python
5
A
Respuesta
10
Puede hacerlo con metaclass o class decorator.
Un decorador de clase (desde 2,6) es probablemente más fácil de entender:
def call_clsinit(cls):
cls._clsinit()
return cls
@call_clsinit
class MyClass:
@classmethod
def _clsinit(cls):
print "MyClass._clsinit()"
metaclases son más poderosos; pueden invocar el código y modificar los ingredientes de la clase antes de que se cree y después (también se pueden heredar):
def call_clsinit(*args, **kwargs):
cls = type(*args, **kwargs)
cls._clsinit()
return cls;
class MyClass(object):
__metaclass__ = call_clsinit
@classmethod
def _clsinit(cls):
print "MyClass._clsinit()"
+2
Agregaría que, al menos desde el texto de la pregunta, es difícil decir por qué '__new__' o' __init__' no solucionan el problema. –
Cuestiones relacionadas
- 1. Llamar al método AppDelegate de la clase
- 2. PHP5.3: error de "Llamar al método indefinido" al llamar a invocar desde la variable de clase
- 3. Llamar a un método de clase dentro de una clase
- 4. Llamar a un método de clase desde esa clase
- 5. Como llamar a un método estático de otra clase
- 6. Crear scripts de Python y llamar a métodos desde C#
- 7. Método de clase Python Wrap
- 8. ¿Llamar a una función dentro de un método de clase?
- 9. Crear un objeto sin llamar a una clase
- 10. AS3: llamar a un método de clase estática - los nombres de clase y método son cadenas
- 11. ¿Cómo llamar a un método de python de una clase java?
- 12. Llamar a un método de Python por nombre
- 13. php: ¿puedo crear y llamar a la función dentro de un método de clase?
- 14. Llamar a un método de clase en after_save
- 15. ¿Cómo llamar a un método de una clase?
- 16. llamar a un método estático dentro de una clase?
- 17. Llamar a un método de instancia privada desde un método de clase en Ruby
- 18. ¿Debería un método de clase modificadora guardarse o ser llamado explícitamente después de llamar al método?
- 19. Cómo llamar al método de clase abstracta en java
- 20. Llamar a un método cada vez antes de llamar a cualquier otro método
- 21. Cómo crear propiedades abstractas en las clases abstractas de Python
- 22. ¿Cómo puedo llamar a las variables miembro de una clase dentro de un método estático?
- 23. Python: herencia de las clases antiguas
- 24. Comprobar condición antes de llamar al método
- 25. ¿Es malo llamar a un método de clase como un método de una instancia?
- 26. ¿Cómo llamar correctamente a los métodos de clase base (y al constructor) de clases heredadas en Python?
- 27. Llamar a un método NSTimer
- 28. Cómo prohibir llamar a un método C#
- 29. Llamar a un método de otro controlador
- 30. C#: ¿Cómo puedo llamar a un método estático de una clase base desde un método estático de una clase derivada?
¿Creación de clases o creación de instancias? Porque ambos se pueden hacer, pero la respuesta es diferente dependiendo. –
Puede usar metaclases para esto. Ver por ejemplo [esta pregunta] (http://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python). – BrenBarn
Aparte: Por favor, no invente '__special_methods__'. Eso está reservado para el lenguaje Python. Use un '_single_underscore_prefix' si desea que sea privado. – delnan