我有一个描述符
class ReferredItem():
def __init__(self, method):
self.method = method
def __get__(self, obj, objtype):
...
我用它作装饰:
class MyClass():
@ReferredItem
some_method(self):
...
我看过装饰器是小写的。但是类应该以camel case命名。
我应该将该课程命名为referred_item
吗?或者保持原样?
答案 0 :(得分:11)
PEP8表示
几乎无一例外,类名都使用CapWords惯例。
没有解释异常是什么,但在标准库中,最常用作函数的类通常遵循函数命名约定。例如。 itertools.groupby
实际上是一个类,但在正常使用中你没有注意到;它是一个实现细节,groupby
可以重写为实际函数。
对于用作装饰器的类,可以使用全小写装饰器命名约定来采用类似的样式:referred_item
,而不是ReferredItem
。
答案 1 :(得分:5)
虽然任何可调用对象都可以用作装饰器,但它们通常被认为是函数,而类函数对象应该遵循“lowercase_with_underscores”约定。
你应该隐藏装饰器是一个类的事实,因为这是一个实现细节。因此,装饰器应遵循“lowercase_with_underscores”样式。这样,如果有一天您决定将装饰器实现为函数,则不必更改用户代码。
就个人而言,我仍然会使用CapWords作为(内部)装饰器类名,并提供一个应该用于装饰器的别名变量:
class _ReferredItem:
def __init__(self, method):
self.method = method
def __get__(self, obj, objtype):
# ...
referred_item = _ReferredItem
答案 2 :(得分:1)
PEP8在这一点上并不是特别清楚...但是非正式地说,我发现一个好的规则是:如果一个类会像函数一样使用(例如,作为装饰器,还有像上下文管理器这样的东西),它应该有像函数一样的小写名称。这似乎是标准库遵循的惯例。
所以我更愿意看到referred_item
而不是ReferredItem
。
答案 3 :(得分:0)
我通常在课堂上使用CamelCase,然后添加一个别名,我将其用作装饰器。
referred_item = ReferredItem