0

質問

オブジェクトをインスタンス化し、そのオブジェクトの属性をクラスメソッドと等しく設定しますが、メソッド( )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()
4

1 に答える 1

1

プロパティを使用すると、article1.author実際に呼び出しself.lookup_authorて返すことができます。

出力:

John Doe
<Author: John Doe>

bob
<Author: bob>

コード:

class Article(object):
    def __init__(self, id, author):
        self.id = id
        self.__author = None

    def lookup_author(self):
        return "John Doe"


    def __str__(self):
        return "<Author: {}>".format(self.author)

    @property
    def author(self):
        if self.__author is None:
            self.__author = self.lookup_author()
        return self.__author

    @author.setter
    def author(self,name):
        self.__author = name

article1 = Article(1, 'John Doe')
print "\n", article1.author
print article1

article1.author = 'bob'
print "\n", article1.author
print article1

何らかの理由で、必要に応じ__authorて、ゲッターが使用されるまで存在する必要さえありません。例外を使用してそれを行うことができます。

于 2012-10-07T03:04:45.037 に答える