2013-07-25 6 views
9

W module threading nazwy takie jak RLock, Semaphore i Event są funkcjami fabrycznymi, a nazwy klas implementacji poprzedzone są podkreśleniami.Dlaczego klasy w module wątków Python udostępniają funkcje fabryczne zamiast konstruktorów?

Fabrycznie funkcje przekazują wszystkie otrzymane argumenty do bazowych konstruktorów.

Jaka jest tego korzyść?

+2

Moje przypuszczenie jest dziedzictwem; moduł jest dość stary. –

+0

@MartijnPieters Czy tak jest? Nadal używam Python2.7 na moim komputerze. – satoru

+0

'Threading' został dodany do biblioteki w 1998; Myślę, że Python w wersji 1.5.1 był pierwszym, który go uwzględnił. –

Odpowiedz

2

Nie ma prawdziwej przewagi.

Guido added the module 1998; pierwsza wersja zawiera już te funkcje fabryczne. Być może miał plany dotyczące tych funkcji fabrycznych, być może przyglądał się implementacji Java i kopiował niektóre idiomy, być może chciał sprawić, by rzeczy były wtykowe z powtórną implementacją C z tyłu głowy.

Możemy tylko zgadywać, lub zapytać bezpośrednio Guido.

3

Archiwum nici-sig wydaje się zniknąć z Internetu (*), ale jestem prawie pewien, że uniemożliwia to podklasy rzeczy, które nie zostały zaprojektowane do subklasowania (naprawdę nie chcesz łamać synchronizacji prymitywami przez przypadek), a moduł jest na tyle duży, że nie można tego zrobić przy użyciu sztuczek z klasy w nowym stylu, gdy został dodany.

Należy również pamiętać, że RLock ma wiele klas implementacji.

*) Cóż, znalazłem kilka pozostałości na serwerze FTP w Grecji, ale to nie miało oryginalnej specyfikacji.

+0

Od kiedy Python (i jego biblioteka) próbują uniemożliwić ludziom robienie dziwnych rzeczy? – glglgl

+0

Od zawsze? W końcu jest to oprogramowanie, więc "zapobiec" oznacza "uczynić go nieco trudniejszym", a nie "uniemożliwić". Jeden oczywisty sposób na to, itp. – Fredrik

+0

OK, ale mimo to jest to normalne zachowanie dla Pythona. Na przykład nie ma żadnych prywatnych ani chronionych atrybutów klas, ponieważ "dorosły" programista ich nie potrzebuje. (Przynajmniej tak mówią.) W takim razie nielogiczne i niekonsekwentne jest zapobieganie dziedziczeniu z 'RLock'. YMMV. – glglgl

Powiązane problemy