質問
オブジェクトをインスタンス化し、そのオブジェクトの属性をクラスメソッドと等しく設定しますが、メソッド( )obj.name
として呼び出さなくても、その属性()へのアクセスを有効にしながら、そのメソッドの呼び出しを遅らせることは可能ですか?obj.name()
バックグラウンド
オブジェクトをインスタンス化するクラスがあります。そのインスタンス化の一部は、データベースオブジェクトと等しい属性を設定することであり、これにはルックアップが必要です。多くのオブジェクト(数百)をインスタンス化する場合、このルックアップは遅くなる可能性があります。
その情報が必要になるまで、どういうわけかそのルックアップを遅らせたいと思います。ただし、そのルックアップを行うためにオブジェクトのメソッドを呼び出す必要はありません。属性(object.attribute
)にアクセスするだけです。
簡単な例/これまでに試したこと
class Article(object):
def __init__(self, id, author):
self.id = id
# Note the lack of () after lookup_author below
self.author = self.lookup_author
# Temporary holding place for author data
self.__author = author
def lookup_author(self):
# A lookup that would be nice to delay / run as needed
# Would be something like Author.objects.get(author=self.__author)
# but set to something simple for this example
return '<Author: John Doe>'
article1 = Article(1, 'John Doe')
# Returns the bound method
# E.g. <bound method Article.lookup_author of <__main__.Article object at 0x100498950>>
print article1.author
# Calls the method properly, however, you have to use the method calling
# notation of .state() versus .state which is more natural and expected
# for attributes
# Returns <Author: John Doe>
print article1.author()