2012-12-07 14 views
21

Co to jest konwencja nazw dla zmiennej odwołującej się do klasy w języku Python?Co to jest konwencja nazw dla odwołań do klas Python

class MyClass(object): 
    pass 

# which one is correct? 
reference_to_class = MyClass 

# or 
ReferenceToClass = MyClass 

Oto kolejny przykład, który przypomina moją sytuację:

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

wolałbym ReferenceToClass, że każdy nowy kodowi wie, że jest to klasa, a nie instancją. Ale, jak pisała @poplitea, odniesienie do literatury byłoby wspaniałe.

+3

ReferenceToClass jest dokładnie taki sam jak MyClass tutaj (semantycznie). Obie są zmiennymi, które odnoszą się do tego samego obiektu klasy. – Kos

Odpowiedz

11

na poziomie modułu a druga:

ReferenceToClass = MyClass

jako argument funkcji, pierwszy:

reference_to_class = MyClass

+3

Wszelkie odniesienia do literatury? – poplitea

+3

pep8 http://www.python.org/dev/peps/pep-0008/. Alias ​​klasy zachowuje się dokładnie tak samo jak klasa, więc nazwa powinna być zgodna z tym samym schematem, co normalne nazywanie klas. – XORcist

+0

Jako argument funkcji, pierwszy, głównie dlatego, że nie możesz wiedzieć na pewno, dostaniesz odejście od typu (to jest klasy). –

2

leczę to samo co zmiennej przykład, co PEP8 określa jako używając lowercase_underscore_style. (Małe, ze słów oddzielonych podkreślenia jest to konieczne w celu zwiększenia czytelności.)

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

4

tl; dr: do nazwy globalne/public używać AllCaps jak XORcist powiedział:

class Logger: 
    pass 

AliasLogger = Logger 

Dla funkcji parametry i locale funkcji, wyjaśnij, że masz do czynienia z obiektem klasy o opisowej nazwie:

def some_func(logger_class): 
    pass 

lub coś wzdłuż linii

def some_func(my_class_classobj): 
    pass 

gdy słowo "class" jest rzeczywiście w swojej nazwy klasy. Dla classobj, zobacz także class_ i klass.


Analiza/Motywacja (wersja długa)

Nie dokładny odczyt, ale na pierwszy rzut oka PEP 8 nie wydają się być jednoznaczne w tej sprawie (przewodnik styl pyton Ani Google dla tej sprawy).

Ponieważ nazwa zmiennej jest prawdopodobnie jeszcze-innym name binding w Pythonie, moim zdaniem nie ma znaczenia, czy wiążę tę nazwę z blokiem definicji lub później z = równym znakiem do jakiegoś obiektu.

Za to zgadzam się z XORcist Na tym poziomie moduł odniesienia „alias” powinny przylegać do standardu klasy nazewnictwa, prawdopodobnie AllCaps:

class MyClass(object): 
    pass 

# good 
ReferenceToClass = MyClass 

jeśli chodzi jednak do parametru i nazwy zmiennych, podobno powinno stosować lowercase_underscores , dobrze? Jestem niezadowolony z tego tylko dlatego, że popchnie cię to do nieścisłości odniesienia instancji a klasy. Istnieje możliwość, że nazwa z małymi literami może być próbą wskazania obiektu będącego instancją.Jeśli o to chodzi, polecam postfixing urządzenie wielofunkcyjne małe litery, klasy przedstawieniu nazwy zmiennych z „klasa” sufiks, tak:

class Logger(object): 
    pass 

def function_expecting_class_reference(logger_class): 
    pass 

I przemianowany swoją przykładową klasę MyClass do Logger ponieważ w realnych scenariuszach tylko kilka klas nazwa zawiera ciąg "class". Jednak w tym ostatnim przypadku proponuję, aby ponownie uniknąć dwuznaczności z opisową nazwą. Na przykład, można użyć classobj przyrostek:

class MyClass(object): 
    pass 

def function_expecting_class_reference(another_param, my_class_classobj): 
    ReferenceToClass = MyClass 

Inną alternatywą I mają tendencję do podjęcia jest użycie przyrostka klass, jak my_class_klass. Nie wszystkim wydaje się, że to drugie, ale w każdym razie mam jeszcze sprawdzić, czy uda im się uzyskać lepsze wyniki.

+1

+1 za sugerowanie sufiksu. Często używam przyrostka "_ref", aby wyjaśnić i poprawić czytelność kodu podczas przypisywania zmiennej do odwołania do obiektu. –

Powiązane problemy