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

Pet*_*dec 28 python pep8 naming-conventions

在Python中引用类的变量的命名约定是什么?

class MyClass(object):
    pass

# which one is correct?
reference_to_class = MyClass

# or
ReferenceToClass = MyClass
Run Code Online (Sandbox Code Playgroud)

这是另一个类似于我的情况的例子:

# 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()
Run Code Online (Sandbox Code Playgroud)

我更喜欢ReferenceToClass,每个新来的代码都知道它是一个类,而不是一个实例.但正如@poplitea写的那样,文献参考会很棒.

XOR*_*ist 18

在模块级别第二个:

ReferenceToClass = MyClass

作为函数参数,第一个:

reference_to_class = MyClass

  • pep8 http://www.python.org/dev/peps/pep-0008/.该类的别名行为与类完全相同,因此我认为它的命名应遵循与普通类命名相同的方案. (7认同)
  • 有参考文献吗? (4认同)
  • “第二”和“第一”的含义取决于问题的文本。在答案中写明文可能是一个好主意。 (2认同)

n61*_*007 8

tl; dr:对于AllCaps像XORcist这样的全球/公共名称使用说:

class Logger:
    pass

AliasLogger = Logger
Run Code Online (Sandbox Code Playgroud)

对于函数参数和函数本地,请明确表示您正在使用如下描述性名称处理类对象:

def some_func(logger_class):
    pass
Run Code Online (Sandbox Code Playgroud)

或类似的东西

def some_func(my_class_classobj):
    pass
Run Code Online (Sandbox Code Playgroud)

当这个词"class"实际上在你的类名中时.对于classobj,请参阅class_klass.


分析/动机(长版)

没有彻底的阅读,但一眼就看出PEP 8似乎并不明确(这也不是谷歌的蟒蛇风格指南).

由于变量名可能只是python中的另一个名称绑定,在我看来,无论是将该名称与定义块绑定还是稍后=将某个对象的等号绑定在一起并不重要.

为此,我同意XORcist,模块级"别名"引用应遵循您的类命名标准,可能是AllCaps:

class MyClass(object):
    pass

# good
ReferenceToClass = MyClass
Run Code Online (Sandbox Code Playgroud)

但是,当涉及到参数和变量名称时,应该lowercase_underscores适用,对吧?我只对此感到不满,因为它会将你推向实例与类参考歧义.全小写名称可能是尝试提示对象是实例.就此而言,我建议使用"class"后缀对全小写,类引用变量名称进行后缀,如下所示:

class Logger(object):
    pass

def function_expecting_class_reference(logger_class):
    pass
Run Code Online (Sandbox Code Playgroud)

我将您的示例类重命名为MyClass,Logger因为在实际场景中只有少数类名包含该字符串"class".然而,在后一种情况下,我建议再次使用描述性命名来避免含糊不清.例如,您可以使用classobj后缀:

class MyClass(object):
    pass

def function_expecting_class_reference(another_param, my_class_classobj):
    ReferenceToClass = MyClass
Run Code Online (Sandbox Code Playgroud)

我倾向于采用的另一种方法是使用后缀klass,例如my_class_klass.不是每个人似乎都得到后者,但无论如何我还没有测试他们是否会更好地得到前者.