Python类和命名空间?

时间:2012-09-27 08:18:34

标签: python class namespaces

我想说我想定义一个类名MyClass。

我想要上课。所以,

class MyClass():

    blabla

MyClass = MyClass(abc)

说我想创建一个函数并在该函数中使用MyClass。我发现以下代码将通过例外:

def MyFunction():
    MyClass = MyClass(abc)

MyFunction(123)

任何帮助?我可以这样做

    Myclass1 = MyClass(abc)

但我认为我遗漏了一些关于命名空间的基本知识。谢谢!

2 个答案:

答案 0 :(得分:2)

执行时

MyClass = MyClass(abc)

您正在创建MyClass的新实例,并将其分配给类本身,而使用Myclass1 = MyClass(abc)时,您不会覆盖该类。覆盖类不应该抛出异常(异常可能与使用参数调用MyFunction()方法有关,因为它不需要任何异常,或者可能调用MyClass的构造函数参数,因为那不会采取任何一种),但我想这不是你打算做的。

Myclass1 = MyClass(abc)看起来对我好(除了被传递的参数),虽然我建议使用myClass1(或者更好,常用的my_class1的python样式)用于变量,而不是将第一个字母大写,因为它可以避免混淆哪个对象是一个类。

答案 1 :(得分:1)

MyClass = MyClass(abc)

上述内容与此相同:

def x():
   print 'Hello'
   return 'Hello'

x() # outputs Hello
x = x() # Also ouputs 'Hello' (since x() is called)
x() # Error, since x is now 'Hello' (a string), and you are trying to call it.

在python中,变量的 name 只是指向内存中某个位置的指针。您可以通过将其指向其他位置来自由地将其分配给其他位置(对象)。实际上,您定义的大多数内容都是以这种方式工作的(如方法和类)。它们只是名字。

如果你的方法没有返回值(就像大多数类__init__方法一样),它甚至更奇怪。在这种情况下,左侧是None,您将获得TypeError: 'NoneType' object is not callable。像这样:

>>> def x():
...   print 'Hello'
...
>>> x()
Hello
>>> x = x()
Hello
>>> x()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not callable
>>> type(x)
<type 'NoneType'>