<p>如果您可以直接实例化<code>Resource</code>,那么只需这样做,并直接将路径和<code>get</code>方法粘在一起。在</p>
<pre><code>from types import MethodType
book = Resource()
def get(self):
return aBook
book.get = MethodType(get, book)
book.path = path
</code></pre>
<p>虽然这是假设<code>path</code>和<code>get</code>没有在<code>Resource</code>的<code>__init__</code>方法中使用,并且路径没有被任何不应该考虑的类方法使用。在</p>
<p>如果您的主要关注点是确保没有从<code>Book</code>非类继承,那么您可以使用这个元类</p>
^{pr2}$
<p>您可能希望用更合适的方法替换引发的异常。只有当你发现自己实例化了很多一次性实例时,这才有意义。在</p>
<p>如果这对你来说还不够好,而且你使用的是CPython,你可以尝试一些这样的黑客:</p>
<pre><code>class Resource(object):
def __init__(self, value, location=1):
self.value = value
self.location = location
with Object('book', Resource, 1, location=2):
path = '/books/{id}'
def get(self):
aBook = 'abook'
return aBook
print book.path
print book.get()
</code></pre>
<p>让我的第一个上下文管理器成为可能。在</p>
<pre><code>class Object(object):
def __init__(self, name, cls, *args, **kwargs):
self.cls = cls
self.name = name
self.args = args
self.kwargs = kwargs
def __enter__(self):
self.f_locals = copy.copy(sys._getframe(1).f_locals)
def __exit__(self, exc_type, exc_val, exc_tb):
class cls(self.cls):
pass
f_locals = sys._getframe(1).f_locals
new_items = [item for item in f_locals if item not in self.f_locals]
for item in new_items:
setattr(cls, item, f_locals[item])
del f_locals[item] # Keyser Soze the new names from the enclosing namespace
obj = cls(*self.args, **self.kwargs)
f_locals[self.name] = obj # and insert the new object
</code></pre>
<p>当然,我鼓励你使用我的上述两种解决方案之一,或是凯特里亚莱克斯的ABC建议</p>