我正在尝试在类中创建可执行函数的字典。但无法让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
我已经看到了关于使用字典来索引函数的其他问题,但是没有来自类中的任何问题。
以下是我的问题:
这就是我得到的全部。谢谢你的帮助。
答案 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
参数传递。