0

我不明白为什么这些脚本的行为不同:

class A:
  x=3
  y=5
  __z=8
  def __init__(self):
    print "Hi, I am an instance object of A class!"
    print "I have two components: x i y"
    print "Component x =", self.x
    print "Component y =", self.y
    print 'Component z=', self.__z, 'but z is private'
  def fun1(self):
    return self.x+self.y
class B(A):
  pass 
i=B()
print i.x, i.y, i.fun1()      

如果我删除i=B()line 并将最后一行更改为print B().x, B().y, B().fun1()__init__则打印字符串 3 次,因为每次调用其方法时都会创建类 A。为什么当我创建“i”实例时不会发生同样的事情?

4

2 回答 2

3

您只创建了一个实例B

i=B()

所以__init__只调用一次。在您的另一个示例中,您创建了B3 次的新实例。

于 2013-04-19T18:41:51.537 回答
1

因为__init__每个创建的实例只运行一次(在这种情况之外,这种情况非常罕见,以至于被认为是“从不”,它被显式调用)。创建 1 个实例,运行__init__一次,创建 3 个实例,运行__init__3 次。每次调用时B(),都会创建一个新实例。

另外,请注意您的类属性x,y__z, 属于类本身,而不是它的实例;在你做的时候引用它们self是另一个问题,这是由于你对类和实例之间的区别的明显误解而引起的,这会导致你出现问题。

一个类可以被认为是一个对象的定义。当你调用一个类 ( B()) 时,你创建了它的一个实例。类属性属于定义本身,而实例属性属于对象。

把一个类想象成冲压机的模具。想象一下,你有一个制造汽车挡泥板的模具。每个挡泥板都是一个对象实例。每个挡泥板都有一个颜色,这是一个实例属性。但是,骰子本身也可以有颜色,这将是一个类属性。每个保险杠可以有不同的颜色,您可以更改任何挡泥板的颜色,而无需更改任何其他挡泥板或模具的颜色,但是无论创建多少挡泥板,都只有一个模具,并且只能有一个颜色。

>>> class Fender(object):
...     color = 'red'
...     def __init__(self):
...         self.color = None
...
>>> fenders = [Fender(), Fender()]
>>> Fender.color
'red'
>>> fenders[0].color = 'blue'
>>> fenders[1].color = 'grey'
>>> fenders[0].color
'blue'
>>> fenders[1].color
'grey'
>>> Fender.color
'red'
>>> fenders[0].__class__.color
'red'
>>> Fender.color = 'black'
>>> fenders[0].color
'blue'
>>> fenders[1].color
'grey'
>>> Fender.color
'black'
>>> fenders[0].__class__.color
'black'
于 2013-04-19T18:41:37.307 回答