如果我创建一个这样的简单类:
class Foo:
i = 1
j = 2
我可以通过简单地在右侧使用Foo来实例化一个新对象(而不是说Foo())吗?我猜不会,但我只是尝试了以下它并且它有效:
finst = Foo
print finst.i
答案 0 :(得分:4)
它有效,因为i
不是对象(或实例)的属性,而是类的属性。您不创建新实例。
尝试:
class Foo:
def bar(self):
print 42
finst = Foo
finst.bar()
追踪(最近的呼叫最后):
文件“”,第1行,在中 TypeError:必须使用Foo实例作为第一个参数调用未绑定的方法bar()(没有任何替代)
答案 1 :(得分:1)
您没有实例化对象。您刚刚在类范围中定义了一个变量,并对其进行了访问。
答案 2 :(得分:1)
这是因为finst
仅仅是类Foo
的别名,i
和j
是类变量,而不是实例变量。如果您已将它们声明为实例变量:
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
解码为:
finst
绑定到Foo
类对象。i