2012-12-07 12 views
21

Wie lautet die Namenskonvention für eine Variable, die auf eine Klasse in Python verweist?Wie lautet die Namenskonvention für Python-Klassenreferenzen?

class MyClass(object): 
    pass 

# which one is correct? 
reference_to_class = MyClass 

# or 
ReferenceToClass = MyClass 

Hier ist ein weiteres Beispiel, dass meine Situation ähnelt:

# 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() 

Ich würde ReferenceToClass bevorzugen, dass alle neu auf den Code kennt es eine Klasse ist und nicht eine Instanz. Aber wie @poplitea schrieb, wäre Literaturverweis großartig.

+3

ReferenceToClass ist hier genau wie MyClass (semantisch). Beide sind Variablen, die sich auf das gleiche Klassenobjekt beziehen. – Kos

Antwort

11

auf Modulebene der zweite:

ReferenceToClass = MyClass

Als Funktionsargument, das erste:

reference_to_class = MyClass

+3

Beliebige Literaturhinweise? – poplitea

+3

pep8 http://www.python.org/dev/peps/pep-0008/. Ein Alias ​​für die Klasse verhält sich genau wie die Klasse, daher sollte die Benennung dem gleichen Schema folgen wie die normale Klassenbenennung, denke ich. – XORcist

+0

Als eine Funktion Argument, das erste, vor allem, weil Sie nicht sicher wissen können, erhalten Sie tatsächlich eine Descandant des Typs (d. H. Eine Klasse). –

2

I behandelt es das gleiche wie eine Instanzvariable, die PEP8 definiert als Verwenden von Kleinbuchstaben_underscore_style. (Kleinschreibung, mit von Unterstrichen getrennte Wörter wie nötig die Lesbarkeit zu verbessern.)

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

4

tl; dr: für global/öffentliche Namen AllCaps wie XORcist verwenden sagte:

class Logger: 
    pass 

AliasLogger = Logger 

Für Funktion Parameter und Funktion Einheimische, machen Sie deutlich, dass Sie mit dem Klassenobjekt mit einem beschreibenden Namen wie folgt umgehen:

def some_func(logger_class): 
    pass 

oder etwas entlang der Linien

def some_func(my_class_classobj): 
    pass 

, wenn das Wort "class" tatsächlich in Ihrem Klassennamen ist. Für classobj, siehe auch class_ und klass.


Analyse/Motivation (Langversion)

keine gründlichen Lektüre, sondern auf einen Blick PEP 8 scheint nicht auf diese explizit zu sein (weder was das betrifft Python Style Guide Googles).

Da ein Variablenname wahrscheinlich nur noch-ein andere name binding in Python ist, meiner Meinung nach ist es nicht wirklich wichtig, ob Sie binden, dass Namen mit der Blockdefinition oder später mit den = Gleichheitszeichen auf ein Objekt.

Dafür ich mit XORcist dass Modulebene „alias“ Referenzen stimmen sollte Ihren Klasse Benennungsstandard einhalten, wahrscheinlich ALLCAPS:

class MyClass(object): 
    pass 

# good 
ReferenceToClass = MyClass 

jedoch, wenn es darum geht, und Variablennamen in dem Parameter, angeblich sollte lowercase_underscores anwenden , Recht? Ich bin nur mit dem unzufrieden, da es dich in die Instanz gegen Klassenreferenzmehrdeutigkeit schieben wird. Es besteht die Möglichkeit, dass ein kleingeschriebener Name ein Versuch ist, das Objekt, das eine Instanz ist, anzudeuten.Was das betrifft, empfehlen postfixing ich Ihre all-Klein, Klasse verweisVariablenNamen mit der „Klasse“ Suffix, wie folgt aus:

class Logger(object): 
    pass 

def function_expecting_class_reference(logger_class): 
    pass 

umbenannt ich Ihr Beispielklasse MyClass-Logger weil in realen Szenarien nur wenige Klasse name enthält die Zeichenfolge "class". Im letzteren Fall schlage ich jedoch vor, die Mehrdeutigkeit bei der beschreibenden Benennung noch einmal zu vermeiden. Zum Beispiel können Sie einen classobj Suffix verwenden:

class MyClass(object): 
    pass 

def function_expecting_class_reference(another_param, my_class_classobj): 
    ReferenceToClass = MyClass 

Eine weitere Alternative, die ich nehmen neigen ist das Suffix klass, wie my_class_klass zu verwenden. Nicht jeder scheint letzteres zu bekommen, aber ich muss noch testen, ob sie den ersteren besser bekommen würden.

+1

+1 für das Suffix. Ich verwende oft ein Suffix "_ref", um die Lesbarkeit des Codes zu verdeutlichen und zu verbessern, wenn ich einer Objektreferenz eine Variable zuweise. –

Verwandte Themen