¿Se puede usar un método como método estático o método de instancia?

Me gustaría poder hacer esto:

class A(object): @staticandinstancemethod def B(self=None, x, y): print self is None and "static" or "instance" AB(1,2) A().B(1,2) 

Esto parece ser un problema que debería tener una solución simple, pero no puedo pensar o encontrar una.

Es posible, pero por favor no. Aunque no pude evitar implementarlo:

 class staticandinstancemethod(object): def __init__(self, f): self.f = f def __get__(self, obj, klass=None): def newfunc(*args, **kw): return self.f(obj, *args, **kw) return newfunc 

… y su uso:

 >>> class A(object): ... @staticandinstancemethod ... def B(self, x, y): ... print self is None and "static" or "instance" >>> AB(1,2) static >>> A().B(1,2) instance 

¡Mal!

Como le gustaría que el caso del método estático se use para crear una nueva clase de todos modos, es mejor que lo convierta en un método normal y lo llame al final del método __init__ .

O, si no desea eso, cree una función de fábrica separada fuera de la clase que instanciará un objeto nuevo y vacío, y llame al método deseado.

Probablemente hay maneras de hacer exactamente lo que estás pidiendo, pero vagarán a través de los mecanismos internos de Python, serán confusos, incompatibles a través de Python 2.xy 3.x, y no veo una necesidad real de hacerlo.

Por lo que dices, ¿esto está en la línea de lo que estás buscando? No estoy seguro de que haya una manera de hacer exactamente lo que usted dice que está “incorporado”

 class Foo(object): def __init__(self, a=None, b=None): self.a self.b def Foo(self): if self.a is None and self.b is None: form = CreationForm() else: form = EditingForm() return form 

La respuesta a tu pregunta es no , no puedes hacer eso.

Lo que haría, ya que Python también admite funciones regulares, es definir una función fuera de esa clase, luego llamar a esa función desde un método normal. La persona que llama puede decidir qué se necesita.