web-dev-qa-db-ja.com

Pythonクラス参照の命名規則は何ですか

Pythonでクラスを参照する変数の命名規則は何ですか?

class MyClass(object):
    pass

# which one is correct?
reference_to_class = MyClass

# or
ReferenceToClass = MyClass

これが私の状況に似た別の例です。

# cars.py
class Car(object):
    pass

class Sedan(Car):
    pass

class Coupe(Car):
    pass

class StatonWagon(Car):
    pass

class Van(Car):
    pass

def get_car_class(slug, config):
    return config.get(slug)

# config.py
CONFIG = {
    'ford-mustang': Coupe,
    'buick-riviera': Coupe,
    'chevrolet-caprice': Sedan,
    'chevy-wan' Van:
    'ford-econoline': Van
}

# main.py
from config.py import CONFIG
from cars import get_car_class

MyCarClass = get_car_class('buick-riviera')

my_car = MyCarClass()

私はReferenceToClassを好みます。コードを初めて使用するすべての人は、それがインスタンスではなくクラスであることを知っているからです。しかし、@ popliteaが書いたように、文献参照は素晴らしいでしょう。

33
Peter Hudec

モジュールレベルでは2番目:

ReferenceToClass = MyClass

関数の引数として、最初の:

reference_to_class = MyClass

18
XORcist

tl; dr:グローバル/パブリック名には、XORcistが言ったようにAllCapsを使用します:

class Logger:
    pass

AliasLogger = Logger

関数パラメーターと関数ローカルについては、次のような説明的な名前でクラスオブジェクトを扱っていることを明確にしてください。

def some_func(logger_class):
    pass

または線に沿って何か

def some_func(my_class_classobj):
    pass

word "class"が実際にクラス名に含まれている場合。 classobjについては、class_およびklassも参照してください。


分析/動機(ロングバージョン)

完全に読むことはできませんが、一見したところ PEP 8 はこれについて明示的ではないようです(Googleのpythonその問題についてのスタイルガイドも)。

変数名はおそらくまだ別の name binding であるので、私の意見では、その名前を定義ブロックにバインドするか、後で= equalをバインドするかは重要ではありませんオブジェクトに署名します。

これについて私は XORcist に同意します。モジュールレベルの「エイリアス」参照は、クラスの命名基準、おそらくAllCapsに準拠している必要があります。

class MyClass(object):
    pass

# good
ReferenceToClass = MyClass

ただし、パラメーターと変数の名前に関しては、おそらくlowercase_underscoresを適用する必要がありますよね?インスタンスとクラスの参照のあいまいさの原因になるので、それだけでは不満です。すべて小文字の名前は、オブジェクトがインスタンスであることを示唆する試みである可能性があります。さらに言えば、次のように、すべて小文字のクラス参照変数名に「クラス」接尾辞を付けることをお勧めします。

class Logger(object):
    pass

def function_expecting_class_reference(logger_class):
    pass

実際のシナリオでは、いくつかのクラス名にのみ文字列"class"が含まれているため、サンプルクラスの名前をMyClassからLoggerに変更しました。ただし、後者の場合は、わかりやすい名前付けのあいまいさを回避することをもう一度提案します。たとえば、classobjサフィックスを使用できます。

class MyClass(object):
    pass

def function_expecting_class_reference(another_param, my_class_classobj):
    ReferenceToClass = MyClass

もう1つの方法は、my_class_klassのように、サフィックスklassを使用することです。誰もが後者を手に入れるとは限らないが、とにかく私は彼らが前者をもっと良くするかどうかをまだテストしていない。

8
n611x007

私はそれをPEP8がlowercase_underscore_styleを使用するものとして定義するインスタンス変数と同じように扱います。 (読みやすくするために必要に応じて単語をアンダースコアで区切った小文字)。

http://www.python.org/dev/peps/pep-0008/#id34

2
Corey Goldberg