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?

0
sagar mehta 17 grudzień 2019, 12:03
3
Kiedy nadasz klasie nazwę ABC, ta nazwa nie będzie już powiązana z funkcją. Tak samo jak ponowne przypisanie zmiennej.
 – 
khelwood
17 grudzień 2019, 12:04
W praktyce nigdy nie powinno to mieć miejsca. nazwy funkcji nie byłyby odpowiednie dla nazw klas, a jeśli dwie funkcje mają taką samą nazwę, to prawdopodobnie robią to samo
 – 
Sayse
17 grudzień 2019, 12:16

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!

2
jon 17 grudzień 2019, 13:04
Dzięki @jon , to wyjaśnienie pomaga.
 – 
sagar mehta
18 grudzień 2019, 13:10