【发布时间】:2014-03-02 21:58:46
【问题描述】:
我想为 python 类方法编写一个装饰器,它可以确定该方法是从公共上下文还是私有上下文调用的。例如,给定以下代码
def public_check_decorator(f):
def wrapper(self):
if self.f is `called publicly`: # <-- how do I make this line work correctly?
print 'called publicly'
else:
print 'called privately'
return f(self)
return wrapper
class C(object):
@public_check_decorator
def public_method(self):
pass
def calls_public_method(self):
self.public_method()
运行时执行在理想情况下应该是这样的:
>>> c = C()
>>> c.public_method()
called publicly
>>> c.calls_public_method()
called privately
有没有办法在 python 中做到这一点?也就是改行
if self.f is `called publicly`: # <-- how do I make this line work correctly?
给出想要的输出?
【问题讨论】:
-
只是出于好奇,您为什么需要这样做?
-
你如何定义 public?是不是在任何函数之外调用?在全局函数中调用?别的东西?您是否定义了一个特定的堆栈作为函数的公共入口?
-
c.public_method与calls_public_method中的self.public_method相同。那么您到底要检查什么? -
@Blender 简短的回答——可能是最有用和最明显的——它可以让你强制执行私有范围(或抛出某种错误或错误)。但是,我的使用要复杂一些。给定一个允许延迟初始化类实例的元类(即延迟调用 init),仅在访问“公共”方法时触发 init 调用。或者,延迟到公开访问方法。是的,是的,我知道这里的 my 用例听起来很危险。而且它很可能永远不会看到任何生产代码。但我认为这仍然是一个有趣的问题。
-
@kalefranz 但它有什么不同?
标签: python python-2.7 metaprogramming decorator metaclass