我想创建一个使用类似于此的策略设计模式的类:
class C:
@staticmethod
def default_concrete_strategy():
print("default")
@staticmethod
def other_concrete_strategy():
print("other")
def __init__(self, strategy=C.default_concrete_strategy):
self.strategy = strategy
def execute(self):
self.strategy()
这给出了错误:
NameError: name 'C' is not defined
用strategy=C.default_concrete_strategy
替换strategy=default_concrete_strategy
将起作用,但默认情况下,策略实例变量将是静态方法对象而不是可调用方法。
TypeError: 'staticmethod' object is not callable
如果删除@staticmethod
装饰器,它会起作用,但还有其他方法吗?我希望自己记录默认参数,以便其他人立即看到如何包含策略的示例。
此外,是否有更好的方法来公开策略而不是静态方法?我不认为实现完整的课程在这里有意义。
答案 0 :(得分:8)
不,您不能,因为class
定义尚未完成运行,因此当前名称空间中尚未存在类名。
你可以直接使用函数对象:
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
尚不存在,因此您可以通过本地名称引用default_concrete_strategy
。 .__func__
解包staticmethod
描述符以访问基础原始函数(staticmethod
描述符本身不可调用。)
另一种方法是使用哨兵默认值; None
在这里可以正常工作,因为strategy
的所有正常值都是静态函数:
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
由于这从default_concrete_strategy
检索self
,因此在类定义完成后,调用描述符协议并且staticmethod
描述符本身返回(未绑定)函数。