2010-07-02 2 views
16

Я бы хотел вызвать вызов типа object.x, чтобы вернуть результаты некоторого метода, скажем object.other.other_method(). Как я могу это сделать?Python: Как сделать атрибут объекта ссылаться на вызов методом

Edit: Я спросил немного скоро: он выглядит, как я могу сделать это с

object.__dict__['x']=object.other.other_method() 

Является ли это ОК способ сделать это?

+2

Re: ваше редактирование - да и нет ... ваше решение будет * хранить * результаты 'object.other.other_method()' в 'object.x', что означает, что метод будет вызываться только один раз, а не каждый время 'object.x' считывается. Если вы хотите, чтобы метод вызывался каждый раз, @muksie имеет это право - проверьте декоратор 'property'. –

ответ

28

Используйте свойство декоратора

class Test(object): # make sure you inherit from object 
    @property 
    def x(self): 
     return 4 

p = Test() 
p.x # returns 4 

отводом с __dict__ загрязнен, особенно когда @property доступен.

+0

Есть ли способ сделать это динамически? – zml

4

Используйте property

http://docs.python.org/library/functions.html#property

class MyClass(object): 
    def __init__(self, x): 
     self._x = x 

    def get_x(self): 
     print "in get_x: do something here" 
     return self._x 

    def set_x(self, x): 
     print "in set_x: do something" 
     self._x = x 

    x = property(get_x, set_x) 

if __name__ == '__main__': 
    m = MyClass(10) 
    # getting x 
    print 'm.x is %s' % m.x 
    # setting x 
    m.x = 5 
    # getting new x 
    print 'm.x is %s' % m.x 
2

Это будет вызывать только other_method один раз, когда он будет создан

object.__dict__['x']=object.other.other_method() 

Вместо этого вы могли бы сделать это

object.x = property(object.other.other_method) 

Какие вызовы other_method каждый object.x доступ

Конечно вы на самом деле не используя object в качестве имени переменной, вы?

+0

Хех, нет, я не :). Спасибо за ответ, имейте upvote! – mellort

+0

При использовании этой опции 'object.x = property (object.other.other_method)', я получаю '<свойство в 0x1941f02cf48>' при обращении к атрибуту 'x', что мне делать по-другому? – zml

Смежные вопросы