Метод назначения и объекты - PullRequest
3 голосов
/ 15 сентября 2009

У меня проблема с питоном: Я хочу назначить метод для объекта из другого класса, но в этом методе использовать свои собственные атрибуты. Поскольку в моем проекте много контейнеров с разными методами использования (не в этом примере), я не хочу использовать наследование, поэтому мне пришлось бы создавать собственный класс для каждого экземпляра.

class container():
    def __init__(self):
        self.info = "undefiend info attribute"

    def use(self):
        print self.info


class tree():
    def __init__(self):

        # create container instance
        b = container()

        # change b's info attribute
        b.info = "b's info attribute"

        # bound method test is set as use of b and in this case unbound, i think
        b.use = self.test

        # should read b's info attribute and print it
        # should output: test: b's info attribute but test is bound in some way to the tree object
        print b.use()

    # bound method test
    def test(self):
        return "test: "+self.info


if __name__ == "__main__":
    b = tree()

Большое спасибо за то, что прочитали это и, возможно, помогаете мне! :)

Ответы [ 4 ]

2 голосов
/ 15 сентября 2009

Вот, пожалуйста. Вы должны знать, что self.test уже связан, поскольку к тому времени, когда вы находитесь в __init__, экземпляр уже создан и его методы связаны. Поэтому вы должны получить доступ к несвязанному члену, используя член im_func, и связать его с MethodType.

import types

class container():
    def __init__(self):
        self.info = "undefiend info attribute"

    def use(self):
        print self.info


class tree():
    def __init__(self):

        # create container instance
        b = container()

        # change b's info attribute
        b.info = "b's info attribute"

        # bound method test is set as use of b and in this case unbound, i think
        b.use = types.MethodType(self.test.im_func, b, b.__class__)

        # should read b's info attribute and print it
        # should output: test: b's info attribute but test is bound in some way to the tree object
        print b.use()

    # bound method test
    def test(self):
        return "test: "+self.info


if __name__ == "__main__":
    b = tree()
1 голос
/ 15 сентября 2009

Не перемещайте методы динамически.

Просто используйте делегирование. Избегайте магии.

Передайте объект "Дерево" в Контейнер. Это избавляет от необходимости перемещать методы.

class Container( object ):
    def use( self, context ):
        print context.info
        context.test()

class Tree( object ):
    def __init__( self, theContainerToUse ):
        b= theContinerToUse( self )
        print b.use()
    def test( self ):
        print "test"+self.info
1 голос
/ 15 сентября 2009

Используйте tree.test вместо self.test. Атрибуты метода экземпляра привязаны к этому экземпляру.

1 голос
/ 15 сентября 2009

Похоже, вы пытаетесь использовать наследование? Дерево наследуется от контейнера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...