适用于“是”类的类属性/属性的python命名约定?

时间:2013-09-19 23:01:51

标签: python class properties attributes naming-conventions

好的,在下面的代码中,属性名称适合什么?

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的一个大写名称的属性。

1 个答案:

答案 0 :(得分:2)

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

看看PEP 8对类方法的论点的说法:

  

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

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

  

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

你可以在整个stdlib上找到这两种情况和类似情况的例子(例如,分配eggs = type(spam))。

变量(属性,参数,局部变量,全局变量等 - 以及是的,属性,因为整个点是它们看起来像普通的实例属性)获得小写名称。你希望他们持有什么类型的价值并不重要。


  

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

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


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

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