【问题标题】:Is it instance? or a class? python paradox是实例吗?还是一堂课?蟒蛇悖论
【发布时间】: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


【解决方案1】:

您的代码甚至无法按原样运行。如果你修复你的代码实际上是有效的python,那么对于你的第一个问题,F 返回一个类,C,当你说w = worker()时它会被实例化

def F(thing):
    class C(object):
        def __init__(self):
            self.inst = thing()
        def deco(self):
            return "Deco:" + self.inst.who()
    return C

class Worker(object):
    def who(self):
        return "I am a worker"

worker = F(Worker)
print(worker)
w = worker()
print(w)
print(w.deco())

你会得到

<class '__main__.C'>
<__main__.C object at 0x2471e4>
Deco:I am a worker

对于第二个问题,F 正在创建自己的实例,当您调用该实例时,它会返回类 C 的实例。

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(self):
                return "Deco:" + self.inst.who()
        return C(self.anything)

class Worker(object):
    def who(self):
        return "I am a worker too"

worker = F(Worker)
print(worker)
w = worker()
print(w)
print(w.deco())

你会得到

<__main__.F object at 0x243444>
<__main__.C object at 0x243b0c>
Deco:I am a worker too

【讨论】:

  • 感谢您的回复。我不明白你为什么要大写班级的“工人”。我写了 worker = F(worker) 不是逻辑错误,而是 python 中“装饰器”的表达式。不过还是谢谢
  • 因为类名大写是惯例。
猜你喜欢
  • 2010-12-31
  • 1970-01-01
  • 2019-10-23
  • 2019-10-28
  • 2013-06-09
  • 2020-10-03
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多