好的,在下面的代码中,属性名称适合什么?
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的一个大写名称的属性。
答案 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无能为力。