Python类引用的命名约定是什么?

40

在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所写,参考文献也是很好的。


3
在这里,ReferenceToClass 和 MyClass 是完全相同的(从语义上来说)。它们都是指向同一个类对象的变量。 - Kos
3个回答

25
模块级别的第二个: ReferenceToClass = MyClass 作为函数参数的第一个: reference_to_class = MyClass

4
有文献参考吗? - poplitea
7
“pep8 http://www.python.org/dev/peps/pep-0008/”是Python编码风格指南。类别名的行为与类完全相同,因此其命名应遵循普通类别命名的相同规则,我认为是这样的。 - XORcist
作为函数参数的第一个,主要是因为您无法确定您实际上会得到类型的后代(即类)。 - Jonas Schäfer
2
“second”和“first”的含义取决于问题的文本。在答案中写明确的文本可能是一个好主意。 - n611x007

9

简而言之: 对于全球/公共名称,请使用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风格指南也是如此)。

由于变量名可能只是Python中的另一个名称绑定,我认为将该名称与定义块绑定或稍后使用=等号将其绑定到某个对象并不重要。

对此,我同意XORcist的观点,即模块级“别名”引用应遵循您的类命名标准,可能是全大写:

class MyClass(object):
    pass

# good
ReferenceToClass = MyClass

然而,就参数和变量名称而言,应该使用小写下划线,对吗?但我不仅仅不满足于此,因为它会导致实例与类引用的歧义。有可能全小写的名称是试图暗示对象是一个实例。为此,我建议将所有小写的、类引用的变量名后缀加上"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。并不是每个人都理解后者的含义,但无论如何,我还需要测试一下他们是否能更好地理解前者。


1
当我将变量分配给对象引用时,我经常使用“_ref”后缀来澄清和提高代码的可读性。建议加上这个后缀。 - rob_7cc
cls 怎么样? - Solomon Ucko

1
我将其视为实例变量,PEP8将其定义为使用小写下划线样式(lowercase_underscore_style)。即小写字母,必要时用下划线分隔单词以提高可读性。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接