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 規則を使用します。

例外が何であるかは説明しませんが、標準ライブラリでは、関数として最も一般的に使用されるクラスは通常、関数の命名規則に従います。たとえばitertools.groupby、実際にはクラスですが、通常の使用では気付かないでしょう。これは実装の詳細でありgroupby、実際の関数として書き直すことができます。

デコレーターとして使用されるクラスにすべて小文字のデコレーター命名規則を使用することにより、同様のスタイルを採用できreferred_itemます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

私は通常、クラスにCamelCaseを使用してから、デコレータとして使用するエイリアスを追加します。

referred_item = ReferredItem
于 2012-04-18T16:42:53.567 に答える
1

PEP8 はこの点について特に明確ではありません… しかし、非公式に、クラスが関数のように使用される場合 (たとえば、デコレーターとしてだけでなく、コンテキスト マネージャーのようなもの)、適切なルールがあることを発見しました。関数のような小文字の名前。これは、標準ライブラリが従う規則のようです。

referred_itemだから私はむしろ見たいReferredItem.

于 2012-04-18T15:34:48.477 に答える