Tajemnica tutaj jest różnica między obiektów i klasowych przypadkach.
W Pythonie wszystko jest przedmiotem. Klasy są obiektami, liczbami całkowitymi są obiekty, typy są obiektami, a instancje klasy są obiektami. Kiedy mówisz: object()
, otrzymujesz zwykły obiekt na poziomie podstawowym. To nic. Kompletnie bezużyteczny. Niższy poziom niż cokolwiek innego, co możesz odwołać w Pythonie.
Prawdopodobnie uważasz, że wywołanie object()
daje instancję klasy. Co jest zrozumiałe, ponieważ prawdopodobnie uważasz, że object
jest klasą. To nie jest. Nawet jeśli myślisz tak, ponieważ jest to „klasa” zasada stosowana do definicji klas w nowym stylu jak:
class MyClass(object):
pass
object
jest w rzeczywistości typ (jak jak str
i int
są rodzaje).Kiedy dzwonisz pod numer object()
, nie tworzysz instancji klasy, która tworzy instancję specjalnego typu obiektu. Ale w przypadku object
jest to wyjątkowe pod względem tego, jak bardzo jest to blah.
Tylko instancje klas mają specjalną zdolność do poprawiania działania za pomocą notacji kropkowej. To nie jest ogólna właściwość wszystkich obiektów. Wyobraź sobie, że tak było! Możesz robić szalone rzeczy, takie jak dodawanie właściwości do ciągów:
s = "cat"
s.language = "english"
Oczywiście nie możesz tego zrobić.
Zobacz http://stackoverflow.com/questions/1264833/python-class-factory-to-produce-simple-struct-like-classes –
Używam Pythona 2.5, i tak czy inaczej, nazwa krotki nie pozwalają, o ile rozumiem, na dynamiczne podłączanie nowych członków. Z podanych przykładów nie wynika jasno. –
@Stefano Borini: więc w zasadzie prosisz o dyktando, gdzie możesz wymówić 'foo.bar' zamiast' foo ['bar'] '? –