以与我可以说的相同的方式记录一个类的 (private -> _x) 数据成员会很有帮助:
struct foo {
foo* p_a /* Documentation */
foo ** pp_b /* Documentation */
};
但是对于 Python(可以说我们在这里使用不同的编程模型),首选的方法是什么?当我想立即查看此类模型的内容时,通过引用隐式定义它们不会减少它。
这对于直接转换为 UML 图等也很有用。
以与我可以说的相同的方式记录一个类的 (private -> _x) 数据成员会很有帮助:
struct foo {
foo* p_a /* Documentation */
foo ** pp_b /* Documentation */
};
但是对于 Python(可以说我们在这里使用不同的编程模型),首选的方法是什么?当我想立即查看此类模型的内容时,通过引用隐式定义它们不会减少它。
这对于直接转换为 UML 图等也很有用。
您可以使用文档字符串(三引号字符串)作为类或方法中的第一条语句;与文档字符串的标准格式最接近的东西被指定为PEP 257。
class foo( object ):
"""
This is a foo.
_a is foo's a; there are many like it but this one is foo's.
_b is foo's b and demons may fly out of your nose if you modify it.
"""
def __init__( self ): ...
你是对的,Python是一种不同的编程模型。要理解的是,在 Python 中,当您看到以下内容时:
class Foo(object):
...
这不是真正的“类声明”。这更像是一种“阶级创造”。在解释器到达class..
行的那一刻,而不是之前,一个类对象被创建并准备好。关于这个类对象的一件事是它基本上对它的实例一无所知。
该类唯一可以访问实例(并且数据成员通常在实例上)的时间是当它实际通过一个方法运行时。这个语法:
def bar(self, x):
...
很有趣。明确的第一个论点有点暗示正在发生一些不同的事情。没错:当您编写 时instance.bar(x)
,真正发生的是Foo.bar(instance, x)
.
这意味着Foo
获得实例的唯一机会是使用方法。
因此,如果您想要一个显式的类模型,最好的办法可能是在__init__
方法中显式地列出它。
class Foo(object):
def __init__(self):
self._bar = None # Bar is an important "private" member
self._baz = None # As is baz
self._fizzbuzz = 4 # Of course, you can also provide defaults here
如果我在这里偏离了基础,我想得到纠正——但这就是我目前对 Python 的理解。