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使用
这允许您将类用作实例化对象或静态类本身。
对于实例化版本,您可能正在查找
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中将它们用作静态方法,则需要使用
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' |
如果我必须把字典放在班上,为什么我不能把它放在班上的最上面?
任何对象属性都应该在
关于你的问题。类是一种字典或属性和可执行函数的命名元组。函数本身只定义行为。
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) |
当你使用标准的
在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() |