【问题标题】:Class variables, instance variables and inheritance类变量、实例变量和继承
【发布时间】:2013-08-16 12:19:24
【问题描述】:
class C2:
  x = 2
  z = 2

class C3:
  w = 3
  z = 3

  def __init__(self):
    self.w += 1

class C1(C2, C3):
  x = 1
  y = 1

I1 = C1()
I1.name = 'I1'

I2 = C1()
I2.name = 'I2'

print I1.w  # 4
print I2.w  # 4
print C3.w  # 3

你能解释一下最近 3 次打印的结果吗?我找不到这里面的逻辑:)

【问题讨论】:

  • 您已经使用术语类变量与实例变量...C3 是一个类,但I1I2 是实例.. 我不确定这里的混淆是什么?
  • 分配给self.<attribute name> always 将创建一个实例属性,如果之前没有。 读取一个没有实例属性的实例属性将始终通过类来查看它是否在那里定义。所以self.w + 1 返回类属性w 的总和,然后self.w = 将其分配给实例属性w
  • 非常感谢Martijn Pieters

标签: python inheritance class-variables


【解决方案1】:

I'm not sure how self.w += 1 will create an instance variables instead of just increment class variable or raise an exception for missing instance variable?

这可能有助于你理解它:

>>> class Foo:
...  x = 1
...  def __init__(self):
...   print 'self =', self
...   print 'self x =', self.x
...   print 'foo x =', Foo.x
...   print self.x is Foo.x
...   Foo.x = 2
...   self.x = 3
...   print 'self x =', self.x
...   print 'foo x =', Foo.x
... 
>>> a = Foo()
self = <__main__.Foo instance at 0x1957c68>
self x = 1
foo x = 1
True
self x = 2
foo x = 3
>>> print a
<__main__.Foo instance at 0x1957c68>

【讨论】:

    【解决方案2】:

    我不确定你对什么感到困惑。 C3 定义了一个增加self.w 值的__init__ 方法。因此,两个实例都会获得值为4 的实例变量,而类对象本身有一个值为3 的类变量。

    【讨论】:

    • 我不确定 self.w += 1 将如何创建实例变量而不是仅仅增加类变量或引发缺少实例变量的异常?
    • @ju。因为你宣布了。我用一个例子编辑了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 2019-07-17
    • 2014-10-28
    • 1970-01-01
    • 2015-12-09
    相关资源
    最近更新 更多