带有类中函数字典的self参数

时间:2014-04-03 20:35:17

标签: python function dictionary self-reference

我正在尝试在类中创建可执行函数的字典。但无法让self参数正常工作。

请考虑以下代码:

class myclass(object):

  def x(self):
   return 'x'

  def y(self):
   return 'y'

  EF= {
   'a':x,
   'b':y,
  }

  def test(self):
    print self.EF['a']()

当我尝试执行类的'test'函数时,在计算并执行字典中的一个函数时,我得到一个参数数量的错误。

>>> class myclass(object):
...   def x(self):
...    return 'x'
...   def y(self):
...    return 'y'
...   EF= {
...    'a':x,
...    'b':y,
...   }
...   def test(self):
...     print self.EF['a']()
...
>>>
>>>
>>> m=myclass()
>>> m.test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 11, in test
TypeError: x() takes exactly 1 argument (0 given)

我尝试了一些变体,包括不起作用。

  EF= {
   'a':self.x,
   'b':self.y,
  }

唯一可行的是当我明确地将self作为参数传递时,就像这样。

...   def test(self):
...     print self.EF['a'](self)
...
>>> m=myclass()
>>> m.test()
x

我已经看到了关于使用字典来索引函数的其他问题,但是没有来自类中的任何问题。

以下是我的问题:

  • 处理自我参数的正确方法是什么?
  • 我更喜欢将我的字典在类之外的常量移动到我的常量部分。我可以这样做,如果是这样的话怎么样?我应该这样做吗?
  • 如果我需要/必须在课堂上使用我的词典,为什么我不能把它移到班上?

这就是我得到的全部。谢谢你的帮助。

3 个答案:

答案 0 :(得分:3)

处理自我参数的正确方法是什么?

Python使用self标识符与使用this标识符的其他命令式语言类似,但它是显式的(因为显式优于隐式!)

这允许您将类用作实例化对象或静态类本身。

对于实例化版本,您可能正在寻找

>>> class myclass:
    def __init__(self):
        self.EF = {'a':self.x,'b':self.y}
    def x(self):
        return 'x'
    def y(self):
        return 'y'
    def test(self):
        print self.EF['a']()


>>> my_test_class = myclass()
>>> my_test_class.test()
x

我更喜欢将我的字典在类之外的常量移动到我的常量部分。我可以这样做,如果是这样的话怎么样?我应该这样做吗?

如果您想在类定义之外的字典中将它们用作静态方法,则需要使用@staticmethod装饰器

>>> class myclass(object):
    @staticmethod
    def x():
        return 'x'
    @staticmethod
    def y():
        return 'y'


>>> EF = {'a':myclass.x,'b':myclass.y}
>>> EF['a']()
'x'

如果我应该/必须在课堂上使用我的词典,为什么我不能将它移到课堂顶部?

任何对象属性都应该在__init__函数中定义,或者通过显式设置它们。

答案 1 :(得分:1)

在init方法中使用字典将使其正常工作

class Myclass(object):
        def x(self):
                return 'x'

        def y(self):
                return 'y'

        def __init__(self):
                self.EF= {
                        'a':self.x,
                        'b':self.y
                }

        def test(self):
                print self.EF['a']()

m=Myclass()
m.test()

答案 2 :(得分:1)

参考您的问题。该类是一种字典或命名为属性和可执行函数的元组。函数本身只定义行为。 self是与您的实例相关的一大堆状态。如果你在其他地方保存一个指向该函数的指针,并为它提供一个给定的self,它是你的类的一个实例,它应该正常工作。

class MyClass(object):
    def __init__(self, x):
        self.x = x
    def fun(self):
        return self.x

i = MyClass(1)
print i.fun()

f = MyClass.fun
i2 = MyClass(2)

print f(i2)

当您使用标准i.fun()进行呼叫时,它所做的就是将i隐式地作为self参数传递。