首页 > 解决方案 > 这两种情况有什么区别:传递类名与对象

问题描述

我是 Python 新手,不确定很多习语。我找到了函数获取类名作为参数的代码。有什么理由这样做吗?我已将代码简化为:

class A:
    def __init__(self):
        print ("A")


def foo_1(a):
    inst = a()
    return inst


def foo_2(a):
    inst = a
    return inst


if __name__ == "__main__":
    i1 = foo_1(A)
    i2 = foo_2(A())

像 foo_1 (现在的实现方式)和 foo_2 (我认为更直观的方式)实现它有什么区别

谢谢!

标签: python

解决方案


这些做的事情略有不同。

foo_1传递一个class(本身就是一个对象),而不仅仅是它的名字。然后它实例化该类的一个实例,并返回该实例。

foo_2传递一个实例(实际上在这个简化的例子中是任何对象)并返回它。

在此示例中,这意味着i1并且i2似乎是相同的。但它们实际上是不同的对象,例如,它们不会比较相等。

您可以使用类似的东西foo_1作为某个类的实例的工厂,或者在创建实例之前修改类对象。foo_2如果你想对实例做一些事情,你会使用。特别是这意味着如果您多次调用该函数,您每次都可以传递同一个实例,而foo_1总是会生成一个新实例。

所以,这取决于你想做什么。


推荐阅读