在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所写,文学参考会很棒。
答案 0 :(得分:18)
在模块级别第二个:
ReferenceToClass = MyClass
作为函数参数,第一个:
reference_to_class = MyClass
答案 1 :(得分:8)
tl; dr :对于全球/公共名称使用AllCaps
,如XORcist所说:
class Logger:
pass
AliasLogger = Logger
对于函数参数和函数本地,请明确表示您正在使用如下描述性名称处理类对象:
def some_func(logger_class):
pass
或类似的东西
def some_func(my_class_classobj):
pass
单词"class"
实际上在您的类名中。对于classobj
,另请参阅class_
和klass
。
分析/动机(长版)
没有彻底的阅读,但一目了然PEP 8似乎没有明确的说明(谷歌的蟒蛇风格指南也没有)。
由于变量名可能只是python中的另一个name binding,在我看来,是否将该名称与定义块绑定或稍后与=
等号绑定并不重要对某些事物。
为此我同意XORcist在该模块级别“别名”引用应遵循您的类命名标准,可能是AllCaps:
class MyClass(object):
pass
# good
ReferenceToClass = MyClass
但是,当涉及到参数和变量名称时,应该适用lowercase_underscores
,对吧?我只对此感到不满,因为它会将你推向实例与类参考歧义。全小写名称可能是尝试提示对象是实例。就此而言,我建议使用“class”后缀对全小写,类引用变量名称进行后缀,如下所示:
class Logger(object):
pass
def function_expecting_class_reference(logger_class):
pass
我将您的示例类MyClass
重命名为Logger
,因为在实际场景中,只有少数类名包含字符串"class"
。然而,在后一种情况下,我建议再次使用描述性命名来避免含糊不清。例如,您可以使用classobj
后缀:
class MyClass(object):
pass
def function_expecting_class_reference(another_param, my_class_classobj):
ReferenceToClass = MyClass
我倾向于采用的另一种方法是使用后缀klass
,例如my_class_klass
。并不是每个人都会得到后者,但无论如何我还没有测试他们是否会更好地得到前者。
答案 2 :(得分:2)
我认为它与实例变量相同,PEP8将其定义为使用lowercase_underscore_style。 (小写,必要时用下划线分隔,以提高可读性。)