Articles of clase método

Métodos de escritura y clase de pato (o, ¿cómo usar un método de una clase y una instancia?)

Tengo un código que me gustaría pasar instancias o clases de manera intercambiable. Todo lo que haré en ese código es llamar a un método que espero que tengan tanto las clases como las instancias (el método go() en el siguiente ejemplo). Desafortunadamente, no puedo crear un método de clase con el mismo nombre de […]

Python: Cómo llamar a un método de instancia desde un método de clase de la misma clase

Tengo una clase de la siguiente manera: class MyClass(object): int = None def __init__(self, *args, **kwargs): for k, v in kwargs.iteritems(): setattr(self, k, v) def get_params(self): return {‘int’: random.randint(0, 10)} @classmethod def new(cls): params = cls.get_params() return cls(**params) Y me gustaría poder hacer: >>> obj = MyClass.new() >>> obj.int # must be defined 9 Quiero […]

¿Es una mala forma llamar a un método de clase como un método desde una instancia?

Ex. Si tengo algo como esto: class C(object): @classmethod def f(cls, x): return x + x Esto funcionará: c = C() cf(2) 4 ¿Pero es esa mala forma? Solo debería llamar Cf() o c.__class__.f() Obviamente, esto solo tendría sentido en los casos en que f no interactúe con self / cls esperando que sea de […]

¿Convertir un objeto BaseClass en un objeto SubClass idiomáticamente?

Hay una clase base Base y una subclase Special . class Base(object): def __init__(self, name): self.name = name def greet(self): return ‘Hello %s’ % self.name class Special(Base): def __init__(self, name): super(Special, self).__init__(name) def rhyme(self): return ‘Hi %s! How are you? Fine, thanks. What about you?’ % self.name ¿Cómo puedo convertir una instancia de Base en […]

Agregar dinámicamente métodos de clase a una clase

Tengo el siguiente fragmento de código: FEED_TYPES = [ (‘fan_mail’, ‘Fan Mail’), (‘review’, ‘Review’), (‘tip’, ‘Tip’), (‘fan_user’, ‘Fan User’), (‘fan_song’, ‘Fan Song’), (‘fan_album’, ‘Fan Album’), (‘played_song’, ‘Played Song’), (‘played_album’, ‘Played Album’), (‘played_radio’, ‘Played Radio’), (‘new_event’, ‘New Event’), ] class Feed: @classmethod def do_create(cls, **kwargs): print kwargs @classmethod def create(cls, type, **kwargs): kwargs[‘feed_type’] = type cls.do_create(**kwargs) […]

¿Hay alguna manera de crear una propiedad de clase en Python?

Lo siguiente no funciona por alguna razón: >>> class foo(object): … @property … @classmethod … def bar(cls): … return “asdf” … >>> foo.bar >>> foo.bar + ‘\n’ Traceback (most recent call last): File “”, line 1, in TypeError: unsupported operand type(s) for +: ‘property’ and ‘str’ ¿Hay alguna manera de hacer esto, o es mi […]

¿Cómo la asignación de una función como atributo de clase se convierte en un método en Python?

>>> class A(object): pass >>> def func(cls): pass >>> A.func = func >>> A.func ¿Cómo esta asignación crea un método? Parece poco intuitivo que la asignación haga lo siguiente para las clases: Convierte las funciones en métodos de instancia no unidos Convierta las funciones envueltas en classmethod() en métodos de clase (en realidad, esto es […]

super y __nueva__ confusión

Como lo que acabo de aprender, puedo usar super() esta manera: super(class, obj_of_class-or-_subclass_of_class) El código va abajo: #Case 1 class A(object): def __init__(self): print “A init” class B(A): def __init__(self): print “B init” super(B, self).__init__() #ok, I can invoke A’s __init__ successfully #Case 2 class A(object): @classmethod def foo(cls): print “A foo” class B(object): @classmethod […]

¿Por qué __getitem__ no puede ser un método de clase?

Supongamos la siguiente clase: class Class(object): @classmethod def getitem(*args): print ‘getitem %s’ % (args,) @classmethod def __getitem__(*args): print ‘__getitem__ %s’ % (args,) El método getitem se comporta como se esperaba: recibe Class como primer argumento, pero __getitem__ recibe type como primer argumento: calling Class.getitem(test) getitem (, ‘test’) calling obj.getitem(test) getitem (, ‘test’) calling Class[test] ‘type’ […]

Llamando a un método de clase de clase base en Python

Considere el siguiente código: class Base(object): @classmethod def do(cls, a): print cls, a class Derived(Base): @classmethod def do(cls, a): print ‘In derived!’ # Base.do(cls, a) — can’t pass `cls` Base.do(a) if __name__ == ‘__main__’: d = Derived() d.do(‘hello’) > $ python play.py > In derived! > msg Desde Derived.do , ¿cómo llamo a Base.do ? […]