Miej moduł jako sample.py z poniższym kodem:
def ABC():
print('Called!')
class ABC(object):
def __init__(self):
print('Class Called')
Teraz, kiedy importuję moduł w powłoce i wywołuję ABC, klasa zostaje wywołana i wiem, że na podstawie instrukcji print widocznej w powłoce. Pomyślałem, że to powinien być konflikt nazw, ponieważ zarówno funkcja, jak i klasa znajdują się w globalnej przestrzeni nazw o tej samej nazwie. Jak działa ten mechanizm?
1 odpowiedź
Funkcja i klasa nie mogą znajdować się „w globalnej przestrzeni nazw o tej samej nazwie”, ponieważ w przeciwnym razie niemożliwe byłoby ich rozróżnienie. Funkcja jest definiowana identyfikatorem ABC, następnie klasa jest definiowana tym samym identyfikatorem ABC, nadpisując go. Widać to wyraźniej w interaktywnym interpretatorze Pythona:
>>> def ABC():
... pass
...
>>> type(ABC)
<class 'function'>
>>> class ABC(object):
... def __init__(self):
... pass
...
>>> type(ABC)
<class 'type'>
To pokazuje, że po definicji funkcji ABC jest typu „funkcja”, ale po definicji klasy jest typu „typ” (co ma miejsce w przypadku klas). W Pythonie, ponieważ wszystko jest obiektem (w tym funkcje i klasy), nazwy (takie jak ABC) mogą być nadpisywane w ten sposób bez generowania błędów. Nie różni się to od:
>>> a = 1
>>> type(a)
<class 'int'>
>>> a = "Mug"
>>> type(a)
<class 'str'>
Oczywiście może to powodować problemy, gdy nie jest to zamierzone; idea przestrzeni nazw jest używana do podziału zakresu nazw, aby identyczne nazwy nie zastępowały się w ten sposób. Na przykład podzielenie kodu na moduły zapewnia oddzielne przestrzenie nazw w każdym module.
W tej chwili lepiej byłoby nazwać swoją klasę i funkcjonować inaczej, aby nazwy nie kolidowały i nie nadpisywały się nawzajem w ten sposób.
Mam nadzieję że to pomogło!
Podobne pytania
Nowe pytania
python
Python to wielozadaniowy, wielozadaniowy język programowania dynamicznie typowany. Został zaprojektowany tak, aby był szybki do nauczenia się, zrozumienia i użycia oraz wymuszania czystej i jednolitej składni. Należy pamiętać, że Python 2 oficjalnie nie jest obsługiwany od 01-01-2020. Mimo to, w przypadku pytań Pythona specyficznych dla wersji, dodaj znacznik [python-2.7] lub [python-3.x]. Korzystając z wariantu Pythona (np. Jython, PyPy) lub biblioteki (np. Pandas i NumPy), należy umieścić go w tagach.
ABC
, ta nazwa nie będzie już powiązana z funkcją. Tak samo jak ponowne przypisanie zmiennej.