How can I use a static method as a default parameter for the strategy design pattern?

后端 未结 1 1082
自闭症患者
自闭症患者 2021-01-12 11:27

I want to make a class that uses a strategy design pattern similar to this:

class C:

    @staticmethod
    def default_concrete_strategy():
        print(\"         


        
相关标签:
1条回答
  • 2021-01-12 11:39

    No, you cannot, because the class definition has not yet completed running so the class name doesn't exist yet in the current namespace.

    You can use the function object directly:

    class C:    
        @staticmethod
        def default_concrete_strategy():
            print("default")
    
        @staticmethod
        def other_concrete_strategy():
            print("other")
    
        def __init__(self, strategy=default_concrete_strategy.__func__):
            self.strategy = strategy
    

    C doesn't exist yet when the methods are being defined, so you refer to default_concrete_strategy by the local name. .__func__ unwraps the staticmethod descriptor to access the underlying original function (a staticmethod descriptor is not itself callable).

    Another approach would be to use a sentinel default; None would work fine here since all normal values for strategy are static functions:

    class C:    
        @staticmethod
        def default_concrete_strategy():
            print("default")
    
        @staticmethod
        def other_concrete_strategy():
            print("other")
    
        def __init__(self, strategy=None):
            if strategy is None:
                strategy = self.default_concrete_strategy
            self.strategy = strategy
    

    Since this retrieves default_concrete_strategy from self the descriptor protocol is invoked and the (unbound) function is returned by the staticmethod descriptor itself, well after the class definition has completed.

    0 讨论(0)
提交回复
热议问题