0

我正在尝试熟悉 python 中的类。在 C++ 中,关于成员变量,类的结构对我来说似乎很简单。您只需在类范围的开头或结尾(根据需要作为公共或私有)声明它们,并根据需要使用它们。

这在python中是如何处理的?

现在我倾向于编写类并在需要的地方声明变量:

class Foo():
    standard = "standard"
    def __init__(self, arg_1, arg_2):
        self.first = arg_1
        self.second = self.do_something(arg_2)

    def do_something(param):
        second = # do something with self.standard and param and store it.
        return second 

    def do_another_thing():
        self.third = # do another thing.

我知道,一个类也可以在没有成员变量的情况下定义,并且可以动态添加。

class Foo():
    pass

foo = Foo()
foo.a = "a"
# etc.

将所有这些放在一起让我感到困惑,因为代码变得更难阅读。

所以我的问题是,关于python中的成员变量,推荐的设计类的方法是什么?


编辑:

我问的方式是误导。对于那个很抱歉!不过,这些答案帮助我理解了其他事情。;-)

我将重新表述:我并不是在询问如何解决我对类内部定义的变量和编码时动态添加的变量的困惑。

我想要解决的是我对 python 类的设计以及成员变量的困惑。我的意思是,最好将它们放在哪里,让潜在的代码读者无需搜索即可查看所有内容。这就是我提到 C++ 中的类的原因。您将所有成员变量放在一个位置,如果您想知道哪些数据存储在类中,您可以查看类的开头或结尾,您将获得所需的所有信息。

在我上面写的例子中,你看,standardis above __init__(self, ...)firstand secondare inside of__init(self,...)thirdis inside do_something(),如果类很大,它可能低于所有其他方法。所以你必须逐行搜索它,或者永远不会意识到它的存在。

我希望我的问题现在能更好地提出。:-)

4

3 回答 3

4

所有这些方法都有效,因此这取决于您自己的代码标准和文档。

就个人而言,我认为在__init__函数中初始化“公共”成员属性是一种很好的做法。这使得它们是什么很明显,并且应该通过在类文档字符串中记录它们来强调这一点。

您仍然可以在整个代码中动态添加变量,但我更喜欢仅在不希望在类本身之外访问变量的情况下使用它(我通常使用单个初始下划线self._foo来表示这一点)。

完全在类之外分配属性也有一个用例,但对我来说,这完全是为了方便使用该类实例的代码,而不是类代码本身。例如,在 Django 中,我经常在request对象中设置自定义属性,因为我知道这将被传递,因此我可以在代码的其他地方访问这些属性。然而,不期望对象本身知道那个额外的包袱。

于 2011-06-05T12:29:41.920 回答
1

你写的时候自己回答了你的问题

将所有这些放在一起让我感到困惑,因为代码变得更难阅读。

我使用更容易阅读的内容。因此,我编写的代码类似于您的第一个代码片段。

当你试图权衡两种可能的方法时,启动你的 python 解释器并执行:import this

于 2011-06-05T12:29:51.097 回答
0

正如您所说,您可以随时在任何方法中创建成员变量。但是,我倾向于在 中创建我的所有成员变量__init__,如果我无法在 中为它们分配实际值,则将它们初始化为合理的默认值__init__。这对我有两件事:1. 如果在将来某个时候我不知道“那个变量到底是从哪里来的”,我可以更好地理解我的课程。2. 它可以防止“分配前使用”错误。

于 2011-06-05T16:00:26.973 回答