python类的属性不在__init__中

时间:2016-08-02 02:11:40

标签: python class variable-assignment

我想知道为什么以下代码有效?

#!/usr/bin/env python3

import sys

class Car():
    def __init__(self):    
        pass

if __name__ == '__main__':
    c = Car()
    c.speed = 3
    c.time = 5
    print(c.speed, c.time)

我意外地发现我没有 init 中的init属性。我向每位导师学习,我必须将作业放在 init 中,如下所示。

#!/usr/bin/env python3

import sys

class Car():
    def __init__(self):    
        self.speed = 3
        self.time = 5

if __name__ == '__main__':
    c = Car()
    print(c.speed, c.time)

如果有一些官方文件可以解释这会更好。

1 个答案:

答案 0 :(得分:2)

它是类属性与实例属性与动态属性。当你这样做时:

class Car():
    def __init__(self):    
        pass

c = Car()
c.speed = 3
c.time = 5

speedtime是动态属性(不确定这是否是官方用语)。如果类的 usage 是在调用Car的任何其他方法之前设置了这些属性,那么这些方法可以使用self.speed。否则,您会收到错误:

>>> d = Car()
>>> d.speed
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Car' object has no attribute 'speed'
>>>

这是因为对于c,速度和时间是该Car实例的属性。它们的存在或价值不会传播到其他Car的实例中。因此,当我创建d然后尝试查找d.speed时,该属性不存在。正如你在自己的评论中所说,“当他们第一次被分配时,它们就会存在。”

  

我意外地发现我没有init中的init属性。我从每个导师那里学到了我必须在初始化中完成作业。

你的导师非常错误,或者你误解了他们的意思。在您提供的示例中,每辆Car都获得相同的初始speedtime。通常,__init__看起来像这样:

class Car():
    def __init__(self, speed, time):  # notice that speed and time are
                                      # passed as arguments to init
        self.speed = speed
        self.time = time

然后,您可以使用Car初始化c = Car(3, 5)。或者如果它是可选的,则将默认值放在init中。

编辑:示例改编from the docs

class Dog:

    kind = 'canine'         # class variable shared by all instances

    def __init__(self, name):
        self.name = name    # instance variable unique to each instance

>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.kind                  # shared by all dogs
'canine'
>>> e.kind                  # shared by all dogs
'canine'
>>> d.name                  # unique to d
'Fido'
>>> e.name                  # unique to e
'Buddy'
>>> d.age = 3               # dynamic attribute/variable, unique to d
>>> d.age
3
>>> e.age                   # e doesn't have it at all
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Dog' object has no attribute 'age'