我遇到了一个pythonic的好奇心,其意义不包括在内。
我发现使用类中字典的方法调度看起来效果不同,具体取决于调度是否在__init__()
中完成。区别在于是否使用self参数调用所选方法。
代码插图:
#!/usr/bin/python
class strange(object):
def _eek(): # no self argument
print "Hi!\n"
dsp_dict = {"Get_eek" : _eek}
noideek = dsp_dict["Get_eek"]
def __init__(self):
self.ideek = self.dsp_dict["Get_eek"]
self.ideek2 = self._eek
self.ideek3 = self.noideek
def call_ideek(self):
try:
self.ideek()
except TypeError:
print "Alas!\n"
def call_ideek2(self):
try:
self.ideek2()
except TypeError:
print "Alas!\n"
def call_ideek3(self):
try:
self.ideek3()
except TypeError:
print "Alas!\n"
def call_noideek(self):
try:
self.noideek()
except TypeError:
print "Alas!\n"
x=strange()
print "Method routed through __init__() using the dictionary:"
x.call_ideek()
print "Method routed through __init__() directly:"
x.call_ideek2()
print "Method routed through __init__() using attribute set from dictionary:"
x.call_ideek3()
print "Method not routed through __init__():"
x.call_noideek()
运行这个,我看到了:
I, kazoo > ./curio.py
Method routed through __init__() using the dictionary:
Hi!
Method routed through __init__() directly:
Alas!
Method routed through __init__() using attribute set from dictionary:
Alas!
Method not routed through __init__():
Alas!
try-except子句正在捕捉这类事情:
Traceback (most recent call last):
File "./curio.py", line 19, in <module>
x.call_noideek()
TypeError: call_noideek() takes no arguments (1 given)
也就是说,如果通过引用字典在__init__
中完成间接,则不会使用隐式self参数调用结果方法。
但是,如果通过直接引用__init__
在_eek()
中完成间接,或者通过创建新属性(noideek
)并从字典中设置,或甚至在{ {1}}通过引用最初从字典设置的属性,然后self参数在调用列表中。
我可以用这个,但我不明白。为什么呼叫签名有所不同?
答案 0 :(得分:0)
看看这个
>>> x.ideek
<function _eek at 0x036AB130>
>>> x.ideek2
<bound method strange._eek of <__main__.strange object at 0x03562C30>>
>>> x.ideek3
<bound method strange._eek of <__main__.strange object at 0x03562C30>>
>>> x.noideek
<bound method strange._eek of <__main__.strange object at 0x03562C30>>
>>> x.dsp_dict
{'Get_eek': <function _eek at 0x036AB130>}
>>> x._eek
<bound method strange._eek of <__main__.strange object at 0x03562C30>>
您可以在此处看到静态方法和类方法之间的区别。
当你将类方法存储在该dict中时,它会丢失有关它的封闭类的信息,并被视为一个函数(参见x.dsp_dict
的输出)。
仅当您将该功能分配给类上下文中的noideek
时,它才会再次成为类方法 。
当从init方法引用dict时,python威胁它作为静态方法(&#34; function&#34;)不改变任何东西并且omnitts self参数。 (ideek
)
ideek2
和ideek3
可以被视为&#34;别名&#34;只重新引用该类方法的地方。