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が書いたように、文献参照は素晴らしいでしょう。
モジュールレベルでは2番目:
ReferenceToClass = MyClass
関数の引数として、最初の:
reference_to_class = MyClass
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
を使用することです。誰もが後者を手に入れるとは限らないが、とにかく私は彼らが前者をもっと良くするかどうかをまだテストしていない。
私はそれをPEP8がlowercase_underscore_styleを使用するものとして定義するインスタンス変数と同じように扱います。 (読みやすくするために必要に応じて単語をアンダースコアで区切った小文字)。