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

Python 我是否可以在不使用函数表示法的情况下实例化一个新对象?为什么?,python,class,function,Python,Class,Function,如果我制作一个这样的简单类: class Foo: i = 1 j = 2 我可以简单地在右边使用Foo(而不是说Foo())来实例化一个新对象吗?我想不会,但我只是尝试了以下方法,效果很好: finst = Foo print finst.i 您没有实例化对象。您刚刚在类范围中定义了一个变量,并访问了它。它可以工作,因为i不是对象(或实例)的属性,而是类的属性。您正在而不是创建新实例 尝试: 回溯(最近一次呼叫最后一次): 文件“”,第1行,在 TypeError:必须使用Foo实

如果我制作一个这样的简单类:

class Foo:
  i = 1
  j = 2
我可以简单地在右边使用Foo(而不是说Foo())来实例化一个新对象吗?我想不会,但我只是尝试了以下方法,效果很好:

finst = Foo
print finst.i

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

它可以工作,因为
i
不是对象(或实例)的属性,而是类的属性。您正在而不是创建新实例

尝试:

回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:必须使用Foo实例作为第一个参数调用unbound方法bar()(但没有得到任何结果)


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

class Foo:
    def __init__(self):
        self.i = 1
        self.j = 2
那么您的代码将导致错误


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

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

>>> type(Foo)
<type 'classobj'>
>>> type(Foo())
<type 'instance'>
解码为:

  • 将名称
    finst
    绑定到
    Foo
    类对象
  • 打印类的属性值
    i

  • 那些
    self.i
    self.j
    引用需要使用实例方法(传递给
    self
    的函数)。否则你会得到一个错误:
    self没有定义
    @Trey是的,我自己也发现了。很好的理解。还要注意,您定义的每一个类都应该继承自
    对象(直接或间接)-您不想处理旧式类的混乱。(或者切换到Python 3,它修复了这一问题)
    
    >>> type(Foo)
    <type 'classobj'>
    >>> type(Foo())
    <type 'instance'>
    
    finst = Foo
    print finst.i