ソリューション:彼らは理由__get__
関数のシグネチャの、クラスまたはインスタンスの起動している場合
は、私の知る限りでは、記述子は、区別することができる唯一のオブジェクトです。このプロパティを使用すると、その上にスイッチを作成できます。
class boundmethod(object):
def __init__(self, cls_method=None, instance_method=None, doc=None):
self._cls_method = cls_method
self._instance_method = instance_method
if cls_method:
self._method_name = cls_method.__name__
elif instance_method:
self._method_name = instance_method.__name__
if doc is None and cls_method is not None:
doc = cls_method.__doc__
self.__doc__ = doc
self._method = None
self._object = None
def _find_method(self, instance, instance_type, method_name):
for base in instance_type.mro()[1:]:
method = getattr(base, method_name, None)
if _is_descriptor(method):
method = method.__get__(instance, base)
if method and method is not self:
try:
return method.__func__
except AttributeError:
return method
def __get__(self, instance, instance_type):
if instance is None:
self._method = self._cls_method or self._find_method(instance, instance_type, self._method_name)
self._object = instance_type
else:
self._method = self._instance_method or self._find_method(instance, instance_type, self._method_name)
self._object = instance
return self
@staticmethod
def cls_method(obj=None):
def constructor(cls_method):
if obj is None:
return boundmethod(cls_method, None, cls_method.__doc__)
else:
return type(obj)(cls_method, obj._instance_method, obj.__doc__)
if isinstance(obj, FunctionType):
return boundmethod(obj, None, obj.__doc__)
else:
return constructor
@staticmethod
def instance_method(obj=None):
def constructor(instance_method):
if obj is None:
return boundmethod(None, instance_method, instance_method.__doc__)
else:
return type(obj)(obj._cls_method, instance_method, obj.__doc__)
if isinstance(obj, FunctionType):
return boundmethod(None, obj, obj.__doc__)
else:
return constructor
def __call__(self, *args, **kwargs):
if self._method:
try:
return self._method(self._object, *args, **kwargs)
except TypeError:
return self._method(*args, **kwargs)
return None
例:
>>> class Walkmen(object):
... @boundmethod.cls_method
... def start(self):
... return 'Walkmen start class bound method'
... @boundmethod.instance_method(start)
... def start(self):
... return 'Walkmen start instance bound method'
>>> print Walkmen.start()
Walkmen start class bound method
>>> print Walkmen().start()
Walkmen start instance bound method
私はそれが君たちoをいくつかに役立つことを願っています。
ベスト。
答えとしてソリューションの一部を投稿してください。 – Gabriel
SOのドキュメントセクション(http://stackoverflow.com/documentation)に投稿できます。あるいは、あなたの質問を問題のセクションのみに限定して、ソリューションセクション –
で自分自身で答えることができます。@utsav_deep - 私の答えを問題だけに制限する方法?そのためのオプションはありますか?申し訳ありませんが、質問のために、これらは私の最初のステップStackOverflowです。 –