代码之家  ›  专栏  ›  技术社区  ›  Valentin H

这两种情况之间有什么区别吗:传递类名还是传递对象

  •  0
  • Valentin H  · 技术社区  · 7 年前

    我是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())
    

    在像PoWoS1(现在实现的方式)和FooSy2(我认为更直观的方式)之间实现它有什么不同吗?

    谢谢

    2 回复  |  直到 7 年前
        1
  •  2
  •   Graipher    7 年前

    它们的作用略有不同。

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

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

    在这个例子中,这意味着 i1 和 i2 似乎是一样的。但它们实际上是不同的对象,例如,它们之间的比较并不相等。

    你会使用类似于 福乌1 作为某个类实例的工厂,或在创建实例之前修改类对象。你会用 如果要对实例执行某些操作。特别是,这意味着如果多次调用该函数,则每次都可以传递相同的实例,而 福乌1 将始终生成一个新实例。

        2
  •  1
  •   blueteeth    7 年前

    你所拥有的 foo_2 可以简化为只使用对象,这是您应该做的。

    两种选择都有效,但是 foo_1

    i = foo_2(A())
    

    i = A()
    

    比如说你上了一门新课 B ,必须使用一些参数对其进行实例化。从一开始就这么说更复杂 福乌1

    class B:
        def __init__(self, c):
            self.c = c
    

    你可以做:

    i = B()
    j = foo_2(B())
    k = foo_1(B) => TypeError: __init__() missing 1 required positional argument: 'c'
    

    你可以修改 福乌1 但是,如果您不知道要实例化什么类(如果您通过用户输入获取该类),那么获取参数可能会很有用。

    # function that takes 1 parameter followed by any number of paramters
    def foo_3(klass, *params):
        inst = klass(*params)  # pass the any number of paramters onto the instantiation
        return inst