关于python:类内函数字典的自参数

The self parameter with a dictionary of functions within a class

我正试图在一个类中创建一个可执行函数的字典。但无法使自身参数正常工作。

考虑以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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"函数时,当它计算并执行字典中的一个函数时,我得到一个关于参数数量的错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>>> 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)

我试过一些变化,包括这个不起作用。

1
2
3
4
  EF= {
   'a':self.x,
   'b':self.y,
  }

唯一起作用的是当我显式地将self作为参数传递时,就像这样。

1
2
3
4
5
6
...   def test(self):
...     print self.EF['a'](self)
...
>>> m=myclass()
>>> m.test()
x

我还看到过关于使用字典索引函数的其他问题,但在一个类中没有。

以下是我的问题:

  • 处理自参数的正确方法是什么?
  • 我宁愿把字典常量移到类外的常量部分。我能做到吗?如果可以,怎么做?我应该这样做吗?
  • 如果我必须把字典放在班上,为什么我不能把它放在班上的最上面?

我只有这些。谢谢你的帮助。


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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> 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

我宁愿把字典常量移到类外的常量部分。我能做到吗?如果可以,怎么做?我应该这样做吗?

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

1
2
3
4
5
6
7
8
9
10
11
12
>>> class myclass(object):
    @staticmethod
    def x():
        return 'x'
    @staticmethod
    def y():
        return 'y'


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

如果我必须把字典放在班上,为什么我不能把它放在班上的最上面?

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
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参数。


在in it方法中使用字典将使其工作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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()