Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > доопределить методы объекту


Автор: dipsy 6.8.2008, 16:55
существующему объекту можно доопределить метод 
Код
def foo():
    return "a"
object.foo = foo

можно сделать так, чтобы метод имел доступ к объекту:
Код
def foo( self ):
    return repr( dir( self ) )

object.foo = foo
req.write( repr( object.foo( object ) ) )

можно ли определить метод для объекта, чтобы не передавать сам же объект в качестве параметра, но иметь доступ к объекту?

Автор: Lazin 6.8.2008, 17:03
да вроде-бы нельзя, а зачем это нужно?

Автор: _Viper_ 6.8.2008, 18:40
Можно сделать так, взято с http://http://code.activestate.com/recipes/langs/python/:
Код

class A(object):
    def func(self):
        print self.__class__.__name__

def func1(self):
    print "func1"

def func2(self):
    print "func2"

def add_method_to_one(self, method, name=None):
  if name is None: name = method.func_name
  class new(self.__class__): pass
  setattr(new, name, method)
  self.__class__ = new

def add_method_to_all(self, method, name=None):
  if name is None: name = method.func_name
  setattr(self.__class__, name, method)

a = A()
b = A()

a.func()
b.func()
print

add_method_to_all(b, func2, "func")
a.func()
b.func()
print

add_method_to_one(a, func1, "func")
a.func()
b.func()

Автор: dipsy 7.8.2008, 11:32
именно то, что надо! спасибо!

Автор: silently_fox 8.8.2008, 00:47
можно еще декоратор прикрутить:

Код

class dynamicmethod(object):
    """Class implements decorator for making instance methods

        Example:

            class Dummy(object): pass
            dum = Dummy()

            @dynamicmethod(dum)
            def see_hello(self):
                return 'hello'

            print dum.see_hello() # prints 'hello'
    """

    def __init__(self, instance):
        self.instance = instance


    def __call__(self, func):

        # get instancemethod descriptor
        im_descriptor = self.__init__.__class__

        method = im_descriptor(func, self.instance, self.instance.__class__)
        setattr(self.instance, func.__name__, method)

        return method


def _test():
    class T(object):pass
    t=T()

    @dynamicmethod(t)
    def who(self):
        print 'opps!'

    t.who()

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)