0

__getattr__Python には、カスタム値を返すことを可能にする魔法のメソッドがあります。

class A(object):
    def __getattr__(self, name):
        return name

B = A()
print B.foo  # 'foo'

A.fooただし、 A はインスタンスではないため、呼び出しても同様の効果はありません。

metaclasses を使用すると、Google App Engine はインスタンス化時に次のエラーを発生させます。

File "/base/python27_runtime/python27_lib/versions/1/google/appengine/ext/db/__init__.py", line 913, in __init__
key_name.__class__.__name__)
    BadKeyError: Name must be string type, not tuple

参照されている質問が正しく実装されていると仮定すると、魔法のクラス__getattr__を実装できる他の方法は何ですか?

4

2 に答える 2

1

これがあなたの質問に答えるかどうかはわかりませんが、プロパティ記述子をチェックアウトするかもしれません..

class RevealAccess(object):
"""A data descriptor that sets and returns values
   normally and prints a message logging their access.
"""

def __init__(self, initval=None, name='var'):
    self.val = initval
    self.name = name

def __get__(self, obj, objtype):
    print 'Retrieving', self.name
    return self.val

def __set__(self, obj, val):
    print 'Updating' , self.name
    self.val = val

>>> class MyClass(object):
    x = RevealAccess(10, 'var "x"')
    y = 5
>>> MyClass.x
Retrieving var "x"
10
>>> MyClass().x
Retrieving var "x"
10
>>> 
>>> m = MyClass()
>>> m.x
Retrieving var "x"
10
>>> m.x = 20
Updating var "x"
>>> m.x
Retrieving var "x"
20
>>> m.y
5
于 2012-08-03T23:44:45.133 に答える