方法参数列表中的自我奇怪的细微差别

时间:2017-02-14 19:10:39

标签: python python-2.7 dictionary

我遇到了一个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参数在调用列表中。

我可以用这个,但我不明白。为什么呼叫签名有所不同?

1 个答案:

答案 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

ideek2ideek3可以被视为&#34;别名&#34;只重新引用该类方法的地方。