【问题标题】:Can I instantiate a new object without using function notation? Why?我可以在不使用函数表示法的情况下实例化一个新对象吗?为什么?
【发布时间】:2011-01-02 18:59:54
【问题描述】:

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

class Foo:
  i = 1
  j = 2

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

finst = Foo
print finst.i

【问题讨论】:

  • 还要注意,你定义的每一个类都应该继承自object(直接或间接)——你不想处理旧式类的混乱。 (或者切换到 Python 3,它修复了这个问题)

标签: python class function


【解决方案1】:

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

试试:

class Foo:
  def bar(self):
    print 42

finst = Foo
finst.bar()

回溯(最近一次通话最后一次):
文件“”,第 1 行,在
TypeError: unbound method bar() must be called with Foo 实例作为第一个参数(什么都没有)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      Foo 本身就是class Foo 的类对象:

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

      您的代码:

      finst = Foo
      print finst.i
      

      解码为:

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

      【讨论】:

        【解决方案4】:

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

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

        那么你的代码会导致错误。

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

        【讨论】:

        • 那些self.iself.j 引用需要在一个实例方法下(self 被传入的函数)。否则你会得到一个错误:self is not defined.
        • @Trey 是的,我自己也发现了。很好的收获。
        猜你喜欢
        • 1970-01-01
        • 2022-07-22
        • 2011-03-30
        • 1970-01-01
        • 2021-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多