我可以在不使用函数表示法的情况下实例化新对象吗?为什么?

时间:2011-01-02 18:59:55

标签: python class function

如果我创建一个这样的简单类:

class Foo:
  i = 1
  j = 2

我可以通过简单地在右侧使用Foo来实例化一个新对象(而不是说Foo())吗?我猜不会,但我只是尝试了以下它并且它有效:

finst = Foo
print finst.i

4 个答案:

答案 0 :(得分:4)

它有效,因为i不是对象(或实例)的属性,而是类的属性。您创建新实例。

尝试:

class Foo:
  def bar(self):
    print 42

finst = Foo
finst.bar()
  

追踪(最近的呼叫最后):
    文件“”,第1行,在中   TypeError:必须使用Foo实例作为第一个参数调用未绑定的方法bar()(没有任何替代)

答案 1 :(得分:1)

您没有实例化对象。您刚刚在类范围中定义了一个变量,并对其进行了访问。

答案 2 :(得分:1)

这是因为finst仅仅是类Foo的别名,ij是类变量,而不是实例变量。如果您已将它们声明为实例变量:

class Foo:
    def __init__(self):
        self.i = 1
        self.j = 2

然后您的代码会导致错误。

要回答您的问题,不,您必须调用构造函数来创建实例。

答案 3 :(得分:1)

Foo本身就是class Foo的对象:

>>> type(Foo)
<type 'classobj'>
>>> type(Foo())
<type 'instance'>

您的代码:

finst = Foo
print finst.i

解码为:

  1. 将名称finst绑定到Foo类对象。
  2. 打印类'attribute i
  3. 的值