python类的属性不在__init__中

莱昂

我想知道以下代码为何起作用?

#!/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)

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

无液

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

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

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

speed并且time是动态属性(不确定这是否是正式术语)如果用法是在调用任何其他方法之前设置这些属性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'
>>>

发生这种情况的原因是cfor ,speed和time是该实例的属性Car它们的存在或价值不会在Car的其他实例中传播。因此,当我创建d然后尝试查找时d.speed,该属性不存在。正如您在自己的评论中说的那样,“它们在首次分配给它们时就应运而生。”

我无意间发现我不必在init中使用init属性。我从每位导师那里学习,我必须像下面这样将作业放在init中。

您的导师很错,或者您误解了他们的意思。在您提供的示例中,每辆Car的首字母speed都相同time通常,an__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中。

编辑:改编自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'

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章