1

好的,在下面的代码中,属性名称应该是什么?

class ClassOne(object):
    a = 1

class ClassTwo(object):
    some_class = ClassOne

    def _get_other_class(self):
        return self._other_class

    def _set_other_class(self, value):
        self._other_class = value

    other_class = property(_get_other_class, _set_other_class)

    class InnerClass(object):
        b = 2

“some_class”更适合“some_class”,因为它是一个属性,还是“SomeClass”,因为它引用了一个类?与“other_class”相同。所以第二个选项更像是:

class ClassOne(object):
    a = 1

class ClassTwo(object):
    SomeClass = ClassOne

    def _get_other_class(self):
        return self._other_class

    def _set_other_class(self, value):
        self._other_class = value

    OtherClass = property(_get_other_class, _set_other_class)

    class InnerClass(object):
        b = 2

如果大写它们似乎更清楚它们是类,但 pep8 说属性应该是带有下划线的小写。但是,InnerClass 最终成为 ClassTwo 的一个属性,名称大写。

4

1 回答 1

2

在您的示例中,这些变量保存类对象的事实似乎无关紧要。

看看 PEP 8 关于类方法的参数的说法:

始终使用cls或类方法的第一个参数。

在下一行,你有这个例子:

如果函数参数的名称与保留关键字发生冲突,通常最好在结尾附加一个下划线,而不是使用缩写或拼写错误。因此class_优于clss

您可以在整个标准库中找到这两种情况和类似情况(例如,分配eggs = type(spam))的示例。

变量(属性、参数、局部变量、全局变量等——是的,还有属性,因为重点是它们看起来像普通的实例属性)使用小写字母名称。你期望他们持有什么类型的价值并不重要。


但是,InnerClass最终成为ClassTwo具有大写名称的属性。

这是真的,但它不相关。ClassTwo这与最终成为模块中的全局变量的方式完全相同。InnerClass被定义为一个类,而不是一个变量/参数/属性。


当然,您可以提出不太清楚的边缘情况。例如,你应该做foo_bar = types.ClassType('foo_bar', (object,), {})orFooBar = types.ClassType('FooBar', (object,), {})foo_bar = types.ClassType('FooBar', (object,), {})吗?

但 PEP 8 并不是一套涵盖所有场景的硬性规则。总是有边缘情况。大多数时候,类和变量之间的区别是显而易见的,因此 PEP 8 的推荐是显而易见的。当区别不明显时,PEP 8 无能为力。

于 2013-09-19T23:33:00.663 回答