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