6

これが私の問題です。次のクラスに一連のプロパティ属性を持たせたいです。fooとのようにそれらをすべて書き出すかbar、または私が見た他のいくつかの例に基づいて、クラスデコレータ、メタクラスを使用するか、__new__メソッドをオーバーライドしてプロパティを自動的に設定できるように見えます。それを行うための「正しい」方法が何であるかはわかりません。

class Test(object):
    def calculate_attr(self, attr):
        # do calculaty stuff
        return attr

    @property
    def foo(self):
        return self.calculate_attr('foo')

    @property
    def bar(self):
        return self.calculate_attr('bar')
4

3 に答える 3

5

魔法は悪いです。コードの理解と維持が難しくなります。メタクラスや。は事実上必要ありません__new__

あなたのユースケースは非常に単純なコードで実装できるようです(ほんの少しの魔法で):

class Test(object):
    def calculate_attr(self, attr):
        return something

    def __getattr__(self, name):
        return self.calculate_attr(name)
于 2010-03-24T00:01:18.690 に答える
2

メタクラスは、作成するクラス__new__のになりません__new__。クラス自体を作成するために使用されます。実際のクラスオブジェクトは、メタクラスによって返されます。クラスの新しいインスタンスはによって返され__new__ます。

次の(非常識な)コードを考えてみましょう。

def MyMetaClass(name, bases, dict):
    print "name", name
    print "bases", bases
    print "dict", dict
    return 7

class C('hello', 'world'):
    __metaclass__ = MyMetaClass

    foo = "bar"

    def baz(self, qux):
        pass

print "C", C

(メタクラスとしてクラスの代わりに関数を使用しました。任意の呼び出し可能オブジェクトをメタクラスとして使用できますが、多くの人はtype、新しいオーバーライドを使用して継承するクラスとしてそれらを正しく選択します。関数との違いは微妙です。)

出力します

name C
bases ('hello', 'world')
dict {'baz': <function baz at 0x4034c844>, '__module__': '__main__', 'foo': 'bar', '__metaclass__': <function MyMetaClass at 0x40345c34>}
C 7

それは、メタクラスが何であるかをよりよく理解するのに役立ちますか?

独自のメタクラスを定義する必要はほとんどありません。

于 2010-03-23T21:33:48.443 に答える
1

メタクラスは、インスタンスではなく新しいクラスが作成されるときに使用されます。このようにして、たとえばクラスを登録できます(djangoがそれを行い、たとえばデータベースにテーブルを作成するために使用します)。classはクラスのデコレータとして考えることができる命令です。

于 2010-03-23T21:34:22.643 に答える