11

我有一个描述符

class ReferredItem(): 
    def __init__(self, method):
        self.method = method

    def __get__(self, obj, objtype):
        ...

我用它作为装饰器:

class MyClass():

    @ReferredItem
    some_method(self):
        ...

我见过装饰器是小写的。但是类应该以驼峰命名。

我应该像这样命名课程referred_item吗?还是保持现在的样子?

4

4 回答 4

14

PEP8指出

几乎无一例外,类名都使用 CapWords 约定。

没有解释异常是什么,但在标准库中,最常用作函数的类通常遵循函数命名约定。egitertools.groupby实际上是一个类,但在普通用法中你不会注意到;这是一个实现细节,groupby可以重写为实际功能。

您可以通过对用作装饰器的类使用全小写的装饰器命名约定来采用类似的样式:referred_item, not ReferredItem

于 2012-04-18T15:32:53.347 回答
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
于 2012-04-18T15:42:19.967 回答
1

PEP8 在这一点上并不是特别清楚......但非正式地,我发现一个很好的规则是:如果一个类将像函数一样使用(例如,作为装饰器,也像上下文管理器之类的东西),它应该有一个小写名称,如函数。这似乎是标准库遵循的约定。

所以我宁愿看到而referred_item不是ReferredItem

于 2012-04-18T15:34:48.477 回答
1

我通常使用 CamelCase 作为类,然后添加我用作装饰器的别名。

referred_item = ReferredItem
于 2012-04-18T16:42:53.567 回答