<p>你需要在类上显式地声明一个对象。在</p>
<p>描述符对象是定义<code>__get__</code>方法的任何对象,当描述符是类的一部分时,它允许用户自定义属性检索。在这种情况下,我们希望当从实例中检索到该属性(即“Y”类)时,只要从该类检索到方法,该实例就会插入到参数列表中。在</p>
<p>这要求检索到的属性本身是一个具有自定义属性访问权限的“代理”类,以允许动态包装得到注意。在</p>
<p>将所有这些转换为Python,我们可以:</p>
<pre><code>import types
from functools import partial
class APIWrapper(object):
def __init__(self, apicls, instance):
self._apicls = apicls
self._instance = instance
def __getattribute__(self, attr):
apicls = object.__getattribute__(self, "_apicls")
instance = object.__getattribute__(self,"_instance")
obj = getattr(apicls, attr)
if isinstance(obj, types.MethodType):
return partial(obj,instance)
return obj
class APIProperty(object):
def __init__(self, cls):
self.cls = cls
def __get__(self, instance, cls):
return APIWrapper(self.cls, instance)
class Y(object):
@classmethod
def method(cls, x, *args):
print cls, x, args
class X(object):
Y = APIProperty(Y)
#Example usage:
x = X()
x.Y.method(1,2,3)
</code></pre>
<p>(运行时打印<code><class '__main__.Y'> <__main__.X object at 0x18ad090> (1, 2, 3)</code>)</p>
<p>但我想你不需要写信</p>
^{pr2}$
<p>对于每个要以这种方式包装的类。(并在封装的类之后定义这些类,以便在解析X body时Y已经被解析)。在</p>
<p>这可以用元类,类修饰符来实现,它们必须为你想要应用方法的每个类定义——相反,我创建了一个在模块定义末尾调用的函数,在您定义“X”类的地方-此函数将为每个定义的类添加所需的类作为属性(在我的示例中,我希望用“auto_api”属性标记类-但要适合您自己)-
因此,“auto_api”函数,X和Y类的定义是这样的(使用与上述相同的APIProperty和APIWrapper)</p>
<pre><code>def auto_api(api_classes, glob_dict):
for key, value in glob_dict.items():
if isinstance(value, type) and hasattr(value, "auto_api"):
for api_class in api_classes:
setattr(value, api_class.__name__, APIProperty(api_class))
class X(object):
auto_api = True
class Y(object):
@classmethod
def method(cls, x, *args):
print cls, x, args
auto_api((Y,), globals())
#Example
x = X()
x.Y.method(1,2,3)
</code></pre>