所以我理解在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之外定义什么?
答案 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