分配给循环中的类的方法与循环中的最后一个方法完全相同

时间:2017-06-27 10:27:01

标签: python-2.7 class methods variable-assignment

我正在使用方法工厂动态地将函数分配给类,如下所示:

def method_man(cls):
    items = ['spam', 'eggs', 'bacon']
    for item in items:

        def method(cls):
            return 'Here are your {}'.format(item)

        setattr(cls, item, classmethod(method))
    return cls


@method_man
class DinnerTime(object):
    pass

然而,方法setattr()似乎没有分配函数,而是似乎在为每个迭代时修改的method的内存位置分配一个指针:

In [52]: DinnerTime.bacon()
Out[52]: "Here's your bacon"

In [53]: DinnerTime.eggs()
Out[53]: "Here's your bacon"

In [54]: DinnerTime.spam()
Out[54]: "Here's your bacon"

如何正确分配功能,以便在以后的迭代中不会覆盖它?

  • 这是一个迟到的问题吗?
  • 我应该在method_man循环中使用函数工厂吗?

1 个答案:

答案 0 :(得分:0)

道歉,我在发布后几秒钟就意识到了问题:功能工厂解决了这个问题。我把我的解决方案放在这里帮助其他人做类似的事情。

出现混乱是因为我已经有一个def function_creator(item): def method(cls): return "Here's your {}".format(item) return method 工厂,并没有意识到我仍然需要在赋值循环中使用函数工厂:

def method_man(cls):

    def function_creator(item):
        def method(cls):
            return "Here's your {}".format(item)
        return method

    items = ['spam', 'eggs', 'bacon']
    for item in items:
        method = function_creator(item)
        setattr(cls, item, classmethod(method))
    return cls


@method_man
class DinnerTime(object):
    pass

然后代码变成

In [56]: DinnerTime.spam()
Out[56]: "Here's your spam"

In [57]: DinnerTime.eggs()
Out[57]: "Here's your eggs"

In [58]: DinnerTime.bacon()
Out[58]: "Here's your bacon"

输出正确:

    EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML,N'<root xmlns:n="omlNamespace" />'

    insert into lanehistory
    SELECT * FROM OPENXML (@hDoc,'/n:LaneHistory/n:Lane/n:Results/n:ResultPerGrade/n:WeightLimit', 2)
    WITH 
    (
    MachineNumber [varchar](7) '../../../../n:FileProperties/n:MachineNumber',
    StartDateTime [varchar](25) '../../../n:General/n:StartDateTime',
    StopDateTime [varchar](125) '../../../n:General/n:StopDateTime',
    LaneNumber [varchar](6) '../../../n:General/n:LaneNumber',
    ExternalIdentification [varchar](30) '../../../n:Supply/n:ExternalIdentification/n:ID1',
    FlkName [varchar](30) '../../../n:Supply/n:Property/n:Name',
    FlkNumber [varchar](10) '../../../n:Supply/n:Identification/n:TraceCode2',
    UKCode [varchar](10) '../../../n:Supply/n:Identification/n:TraceCode1',
    ProductName [VarChar](30) '../../../n:Product/n:Property/n:Name',
    PRoductType [VarChar](30) '../../../n:Product/n:Property/n:Type',
    Package [VarChar](30) '../../../n:Product/n:Property/n:PackageName',
    EggsPerLane [varchar](6) '../n:Count',
    EggsGraded [FLOAT] '../../../n:Supply/n:Operation/n:AmountOfEggs',
    EDescription [VarChar](30) '../n:Description',
    EWeight [VarChar](30) '../n:Weight',
    MinWeight [VarChar](30) '../n:WeightLimit/n:MinWeight',
    MaxWeight [VarChar](30) '../n:WeightLimit/n:MaxWeight',
    ExtraInfo1 [VarChar](20) '../../../n:Supply/n:Extra/n:Info1',
    ExtraInfo2 [VarChar](20) '../../../n:Supply/n:Extra/n:Info2',
    ExtraInfo3 [VarChar](20) '../../../n:Supply/n:Extra/n:Info3',
    ExtraInfo4 [VarChar](20) '../../../n:Supply/n:Extra/n:Info4',
    ExtraInfo5 [VarChar](20) '../../../n:Supply/n:Extra/n:Info5',
    ShedNo [VarChar](6) '../../../n:Supply/n:Egg/n:ShedNumber',
    ShedType [VarChar](30) '../../../n:Supply/n:Egg/n:Type',
    LayDate [VarChar](12) '../../../n:Supply/n:Dates/n:LayDate',
    SupplyDate [VarChar](12) '../../../n:Supply/n:Dates/n:SupplyDate',
    BestBefore [VarChar](12) '../../../n:Product/n:Dates/n:BestBeforeDate'
    )

    EXEC sp_xml_removedocument @hDoc

的参考文献