【问题标题】:How do I determine what to put inside the __init__ function in a python class?如何确定在 python 类的 __init__ 函数中放入什么?
【发布时间】:2017-01-28 17:29:29
【问题描述】:

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

【问题讨论】:

  • concept = "I am a fruit" 行定义了一个 class 变量,而不是实例变量。
  • test = Fruit('Whatever I want', "other", "Another") 看起来比 test = Fruit() ; test.concept = 'Whatever I want' ; test.concept_2 = "other" ; test.concept_3 = "Another" 更好
  • 开始把所有东西都放进去 __init__,直到你遇到需要做一些不同的事情。
  • __init__ 应该初始化一个对象,使其处于有用状态。
  • @furas 所以它的风格/用户友好性比功能性更强?

标签: python class object


【解决方案1】:
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'

【讨论】:

  • 感谢@Rushy,这很有帮助。我确实阅读了您链接的答案(并在我的问题中链接了它),但它并没有完全回答我的问题。不过,您的回答确实回答了我的问题。非常感谢,这很清楚,很有帮助。
【解决方案2】:

调用类后,实例应该可以运行了,不需要额外的属性设置。

当存在合理的非可变默认值时,您忽略了通常的答案。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-16
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2019-09-11
    • 2016-11-29
    • 2014-03-20
    • 1970-01-01
    相关资源
    最近更新 更多