类名作为python中的变量

时间:2014-01-09 18:52:36

标签: python

我只是在这里看一个问题,OP正在为类,其他东西以及变量使用相同的名称。当我试图回答它时,我自己变得困惑,因此想到了问。

例如:

class MyClass:
      pass

MyClass=MyClass()

虽然,我永远不会编码这样的东西。我想了解python解释器将如何处理它。所以我的问题是,我将使用的变量MyClass将首先创建还是以其他方式创建?也就是说,首先创建一个MyClass实例并将其分配给MyClass变量。我认为后者是正确的,但如果是这样的话,将如何解决以下问题?

class MyClass:
      pass

MyClass=MyClass()
new_class=MyClass()

4 个答案:

答案 0 :(得分:4)

首先处理赋值的右侧,因此创建了MyClass的实例。但是,您将名称MyClass重新分配给该实例。执行时

new_class = MyClass()

你应该得到关于MyClass不可调用的错误,因为该名称现在指的是原始类的实例,而不是类本身。

答案 1 :(得分:3)

class MyClass:
    pass

MyClass=MyClass()

简单来说,上面的代码做了三件事(按此顺序):

  1. 定义班级MyClass

  2. 创建MyClass

  3. 的实例
  4. 将该实例分配给变量MyClass

  5. 在最后一步之后,类MyClass被覆盖,无法再使用。您剩下的就是变量MyClass中包含的实例。

    此外,如果您尝试像调用类一样调用此实例,则会出现错误:

    >>> class MyClass:
    ...     pass
    ...
    >>> MyClass=MyClass()
    >>> new_class=MyClass()
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'MyClass' object is not callable
    >>>
    

答案 2 :(得分:2)

该行:

new_class=MyClass()

在大多数情况下会返回错误,说像实例不可调用。

MyClass现在指的是MyClass之前持有的类的实例。

您可以通过以下方式创建 MyClass的新实例。

new_class = MyClass.__class__()

MyClass只是一个指向/引用特定对象的变量。首先它是类,然后它被更改为保存class的实例。

答案 3 :(得分:-1)

变量在Python中被视为对象。根据我的理解,当您将一个新的MyClass实例分配给一个对象时,python将尝试为该对象创建一个原始类的引用并复制。但是,新对象的命名空间已经被使用(在原始的MyClass中),并且复制将返回错误,因此第一个代码将不起作用。

对于第二段代码,由于名称空间复制的相同原因,最后一行不会执行。由于最后一行失败,建议的参考目标仍然是原始的MyClass,根本不起作用。