如何确定python类中__init__函数内的内容?

时间:2017-01-28 17:29:30

标签: python class object

所以我理解在Python中定义类时如何使用init。但是,我很担心在init函数中放入什么,或者我应该使用它。例如:

这里我让用户在实例化类时定义概念:

class Fruit(object):
    def __init__(self, concept):
        self.concept = concept

但我也可以这样做,用户可以自己更改概念属性:

class Fruit(object):
    def __init__(self):
        self.concept = "I am a fruit"

或者我可以完全放弃 init 功能:

class Fruit(object):
    concept = "I am a fruit"

在每个示例中,我都可以更改概念属性

test = Fruit()
test.concept = 'Whatever I want'

所以我不确定为什么我首先使用init函数。它似乎只是方便预先定义所有属性。

此外,我如何知道在init函数中放置什么以及在init之外定义什么?

2 个答案:

答案 0 :(得分:4)

class Fruit(object):
    def __init__(self, concept):
        self.concept = concept

是最好的方法,因为它允许您作为班级的维护者,灵活地改变内部工作方式。此外,您可能在类中包含客户端应该访问的数据(在Python中,它不可能完全保护数据,但存在一些约定)。

例如:

class Fruit(object):
    def __init__(self, concept):
        self.concept = concept
        self._super_secret_key = get_secret_key(concept)

您可能不希望客户端访问_super_secret_key(同样,它仍然是),但是通过在实例变量前加上_,您传达它应该是私有的。

此外,__init__的目的是初始化实例,因此应该在那里进行任何初始化(例如设置变量)。您可能需要阅读Why do we use __init__ in python classes?

class Fruit(object):
    def __init__(self):
        self.concept = "I am a fruit"
  

在每个示例中,我都可以更改概念属性

test = Fruit()
test.concept = 'Whatever I want'

这种类型的代码很快变得混乱。如果从现在开始一年,您更改concept的变量名称,或完全放弃该用法,该怎么办?该类的所有客户端(即,您使用Fruit类的任何时候)现在都不起作用。

class Fruit(object):
    concept = "I am a fruit"

这有一个完全不同的目的,因为concept现在是一个类变量,而不是一个实例变量。因此,它由所有实例共享,并且可以以类似的方式进行修改:

In [1]: class Fruit(object):
   ...:     concept = "I am a fruit"
   ...:     

In [2]: a = Fruit()

In [3]: a.concept
Out[3]: 'I am a fruit'

In [4]: Fruit.concept = "I am NOT a fruit"

In [5]: a.concept # a.concept has changed just by changing Fruit.concept
Out[5]: 'I am NOT a fruit'

答案 1 :(得分:0)

调用该类之后,该实例应该准备就绪,不需要额外的属性设置。

当你有一个合理的不可变违约时,你忽略了通常的答案。

class Fruit(object):
    def __init__(self, concept='I am a fruit'):
        self.concept = concept