没有基于接口的编程的可用概念(如 C# 接口)
仅仅因为编译器无法检查您是否正确使用接口并不意味着“没有可用的接口概念”。您记录接口并编写单元测试。
至于全局变量,它不是这样的public static
C# 或 Java 类上的方法和字段确实有所不同。例如,考虑 java.lang.Math 的工作原理。现在考虑 java.lang.Mathisn't一个单例。他们这样做是有充分理由的。
有了所有这些好处,依赖注入容器真的有什么意义吗?
我对此表示怀疑,但我也从未真正看到它们在 C# 或 Java 中的意义。依赖注入是一种编程技术, 在我看来。而且实际上也没有那么多。
我一直怀疑依赖注入作为一种设计模式是一种恶臭,一切事物所创造的一定是一类“纳粹思维”
不,不是。很多时候依赖注入是一个好主意。您也不需要一个类来注入依赖项。每次您将某些内容作为参数传递给自由函数时,而不是让该函数调用另一个函数来获取信息,您基本上都在做同样的事情:控制反转。 Python 还允许您在很多方面将模块视为类(当然比 Java 和 C# 的方式更多)。有些问题可以通过将模块作为参数传递给函数来解决。 :)
到目前为止,我认为我可以通过使用全局来涵盖工厂、单例、多实例对象。
如果有的话,单身人士就是难闻的气味。根据我丰富的经验,几乎在每种情况下,它们的存在都是因为有人认为原则上拥有全局是不好的,没有真正考虑可能的选项,或者为什么他们想要对单个共享对象进行这种访问,或者甚至是为什么全局变量从一开始就是“Bad(TM)”。
You could在 Python 中创建一个充当工厂的全局函数。然而,我想说,执行以下任何操作都更Pythonic:
a)首先,真的,真的,really当然你不能只做你想做的事__init__
。我的意思是,在动态类型语言中,您可以通过这种方式做很多事情。
b) If __init__
不会削减它,尝试使用__new__
来控制行为。
在Python中,类本身就是对象,是可调用的。默认情况下,调用它们会实例化该类。和__new__
,你可以加入其中。
c) 使用应用于类的装饰器。这是一个创建单例的示例(只是因为):
def _singleton(cls):
instance = cls()
result = lambda: instance
result.__doc__ = cls.__doc__
return result
@_singleton
class example(object): pass
其工作原理是:当你装饰班级时,_singleton()
被调用,并传入类。实例被构造并缓存,并且_singleton()
返回一个匿名函数,该函数在调用时将返回实例。为了完成这个谜题,类的文档被附加到匿名函数上。然后Python将全局范围内的类名重新绑定到返回的匿名函数。因此,当您调用它时,每次都会获得该类的相同实例。
当然,现在这仍然可以解决(你可以做类似的事情)example().__class__()
获取另一个实例),但与简单地忽略工厂函数以正常使用构造函数相比,您做错了什么更明显。另外,这意味着调用代码实际上就像正常调用构造函数一样:)
Duck Typing 是目前让我着迷的东西,所以习惯于定义接口,然后在这些接口上建立类,并让静态的东西掩盖我的愚蠢,我觉得没有静态类型,容器有点无用。
你需要转变你的想法:停止担心你已经通过的事情is,并担心它是否可以做你想让它做的事。这就是鸭子打字的工作原理。