Kaydet (Commit) 1fb071cc authored tarafından Guido van Rossum's avatar Guido van Rossum

Checkpoint.

üst b2173c31
...@@ -29,10 +29,10 @@ class MetaHelper: ...@@ -29,10 +29,10 @@ class MetaHelper:
raw = self.__formalclass__.__getattr__(name) raw = self.__formalclass__.__getattr__(name)
except AttributeError: except AttributeError:
try: try:
_getattr_ = self.__dict__['_getattr_'] ga = self.__formalclass__.__getattr__('__usergetattr__')
except KeyError: except KeyError:
raise AttributeError, name raise AttributeError, name
return _getattr_(name) return ga(self, name)
if type(raw) != types.FunctionType: if type(raw) != types.FunctionType:
return raw return raw
return self.__methodwrapper__(raw, self) return self.__methodwrapper__(raw, self)
...@@ -50,8 +50,13 @@ class MetaClass: ...@@ -50,8 +50,13 @@ class MetaClass:
__inited = 0 __inited = 0
def __init__(self, name, bases, dict): def __init__(self, name, bases, dict):
if dict.has_key('__getattr__'): try:
raise TypeError, "Can't override __getattr__; use _getattr_" ga = dict['__getattr__']
except KeyError:
pass
else:
dict['__usergetattr__'] = ga
del dict['__getattr__']
self.__name__ = name self.__name__ = name
self.__bases__ = bases self.__bases__ = bases
self.__realdict__ = dict self.__realdict__ = dict
...@@ -98,6 +103,15 @@ def _test(): ...@@ -98,6 +103,15 @@ def _test():
x = C() x = C()
print x print x
x.m1(12) x.m1(12)
class D(C):
def __getattr__(self, name):
if name[:2] == '__': raise AttributeError, name
return "getattr:%s" % name
x = D()
print x.foo
print x._foo
## print x.__foo
## print x.__foo__
if __name__ == '__main__': if __name__ == '__main__':
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment