2013-09-22 12 views
7

Próbuję dowiedzieć się, co będę używać wbudowanej funkcji object() dla. Nie przyjmuje argumentów i zwraca "obiekt bez cech" typu, który jest wspólny dla wszystkich klas Pythona i ma wszystkie metody wspólne dla wszystkich klas Pythona.Kiedy użycie obiektu object() jest przydatne?

Cytując Jack Skellington, WHAT. IS. THIS?

+0

Nie jest przeznaczony do użycia jako funkcja; jest przeznaczony do użycia w klasie bazowej. – refi64

+0

W python 3? Czemu? Co mogę z tego zyskać? Klasy dziedziczą te metody automatycznie, nie? – Aerovistae

+3

Uważam za zabawne, jak w linkach do dokumentacji, które podajesz, ma on jakiś tekst z hiperłączami, który rekurencyjnie wskazuje na siebie. – Shashank

Odpowiedz

11

Nawet jeśli nie trzeba programować z nim, object służy określonemu celowi: jest wspólna klasa, z którego wszystkie inne przedmioty pochodzą. Jest to ostatnia klasa wyszczególniona w metodzie mro (method resolution order). Potrzebujemy nazwy i obiektu dla tej koncepcji, a do tego służy object.

Innym zastosowaniem dla object jest utworzenie sentinels.

sentinel = object() 

ten jest często stosowany w programowaniu wielowątkowym - przeszedł przez kolejkach - do signal a termination event. Możemy nie chcieć wysyłać None lub jakiejkolwiek innej wartości, ponieważ moduł obsługi kolejki może potrzebować interpretować te wartości jako argumenty do przetworzenia. Potrzebujemy unikalnej wartości, której nie może wygenerować żadna inna część programu.

Utworzenie w ten sposób wskaźnika zapewnia taki unikalny obiekt, który na pewno nie jest normalną wartością kolejki, a zatem można go przetestować i wykorzystać jako sygnał dla jakiegoś specjalnego zdarzenia. Istnieją inne możliwości, takie jak tworzenie klasy, instancji klasy lub funkcji, ale wszystkie te alternatywy są większe, mają więcej zasobów i nie są tak obfite jak object().

4

Jest to najbardziej przydatne, jeśli nadpisujesz kropkę (szczególnie __setattr__), pozwala to na przerwanie rekursji. Na przykład:

class SomeClass(object): 
    def __setattr__(self, name, value): 
     if name not in ('attr1', 'attr2', 'attr3', 'attr4'): 
      object.__setattr__(self, name, value) 
     else: 
      do_something_else() 
+1

Witamy w Stack Exchange! Oto twój [przewodnik po imprezach karnawałowych] (http://stackexchange.com/sites) – Aerovistae

+0

Ogólnie unikałbym wywoływania metod bezpośrednio w obiekcie 'object', zamiast używać' super() '. Jednym z powodów jest to, że umożliwia spółdzielcze wielokrotne dziedziczenie. Klasa 'object' nadal będzie oczywiście zaangażowana, ponieważ jest to ostateczna klasa bazowa, do której ostatecznie dojdą wywołania' super() ', ale nie musisz jej wyraźnie wymieniać. – Blckknght

+0

@Blckknght Generalnie zgadzam się z tobą w tej sprawie, jednak w przypadku zerwania rekursji zwykle próbuję złamać rekursję spowodowaną super-klasą (nie działa z frameworkiem?). Jest to jedyny przypadek użycia, w którym ja (ogólnie) jawnie używam obiektu. – Tritium21

Powiązane problemy