【发布时间】:2015-04-20 09:08:50
【问题描述】:
def F(thing):
class C(object):
def __init__(self, thing):
self.inst = thing()
def deco():
return "Deco:" + self.inst.who()
return C
class worker(object):
def who(self):
return "I am a worker"
worker = F(worker)
w = worker()
print(w.deco())
问题:函数F返回什么原型(F()返回C时“C”是什么)?它是一个实例(对象)吗?还是一堂课?
看起来 F(worker) 返回的是一个类,而不是一个实例。
原因是因为如果是实例,那么worker = F(worker)也是实例,是吗?
那么在调用实例时:w = worker(),我们需要装饰器C中的__call__函数,否则无法调用。但实际上我们这里没有__call__,所以看起来它是一个类。
如果你承认,那么请看下面:
class F(object):
def __init__(self, anything):
self.anything = anything
def __call__(self):
class C(object):
def __init__(self, thing):
self.inst = thing()
def deco():
return "Deco:" + self.inst.who()
return C(self.anything())
class worker(object):
def who(self):
return "I am a worker"
worker = F(worker)
w = worker()
print(w.deco())
现在,告诉我worker = F(worker) 的原型是什么?原则上不管F()是什么,都不应该影响worker的原型吧?
那么这里的“worker”(不是worker())应该是一个类,像往常一样(正如我们在第一种情况下推断的那样)。但在这种情况下,它不是!因为当我们调用worker = F(worker)时,因为F是一个类,那么它会通过调用__init__来初始化一个实例!那么现在worker就是实例了!
【问题讨论】:
-
您可以返回一个类或一个类的实例。实际上,班级也有班级。在其他一些语言的对象模型中,两者之间没有区别。
标签: python class oop decorator