tp = type(self) attr = PyType_Lookup(tp, key) if attr: if hasattr(attr, '__get__') and hasattr(attr, '__set__'): # data descriptor return attr.__get__(self, tp) if key in self.__dict__: return self.__dict__[key] if attr: if hasattr(attr, '__get__'): return attr.__get__(self, tp) return attr raise AttributeError データディスクリプタ呼び出し 非データディスクリプタ呼び出し or クラスの属性辞書参照 インスタンス自身の属性辞書参照
fset=None, fdel=None): self.fget = fget self.fset = fset self.fdel = fdel def __get__(self, obj, klass=None): if obj is None: # via class return self if self.fget is not None: return self.fget(obj) raise AttributeError
starttype = su.__self_class__ mro = iter(starttype.__mro__) for cls in mro: if cls is su.__self_class__: break # Note: mro is an iterator, so the second loop # picks up where the first one left off! for cls in mro: if key in cls.__dict__: attr = cls.__dict__[key] if hasattr(attr, '__get__'): return attr.__get__(su.__self__, starttype) return attr 指定されたクラスの mro から、そのクラ スの「次」のクラスを検索している