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

2024-09-22 20:35:52 发布

您现在位置: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所写,参考文献是很好的。


Tags: pyconfiggetobjectmyclasspasscarcars
3条回答

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

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

在第二级模块上:

ReferenceToClass = MyClass

作为函数参数,第一个:

reference_to_class = MyClass

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风格指南也没有)。

因为在python中,变量名可能只是另一个name binding,所以在我看来,将该名称与定义块绑定还是稍后将=等号绑定到某个对象并不重要。

为此,我同意XORcist在模块级“alias”引用应该遵循您的类命名标准,可能是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。不是每个人都能得到后者,但不管怎样,我还没有测试他们是否能把前者变得更好。

相关问题 更多 >