Класове - Език Упътване питон 3

Поради клас механизъм Python на езика с минимум нов синтаксис и семантика се добавя възможността за създаване на класове. Тази смес беше механизми клас заимствани от C ++ и Modula-3. Както и в случая на модули, класове в Python не доказват абсолютно бариера между дефиниция и програмист, разчитайки повече на точност и учтивост на последния - че не е "проникнал в определението". Най-важните характеристики на класове, обаче, съдържат всички възможни сила: механизъм клас наследство поддържа множество предшественици за клас, извлечен клас може да претовари всички методи за неговото предшественик или предшественици, и всеки метод може да доведе до нейното метод предшественик на същото име. Обектите могат да съдържат произволен брой затворени (частни) данни.

В C ++ терминология, членовете на групата (включително членовете на данни) обикновено са отворени (публично) (с изключение на частните променливи са описани по-долу.), Както и всички член-функции - виртуално. Няма специални конструктори и деструктори. Както и в Modula-3, има кратка справка за възрази членове от неговите методи: функция-метод се определя с първия аргумент изрично описващ предмета, който е безусловно предават в поканата. Както и в Smalltalk, самите класове са обекти, макар и в по-широк смисъл: в Python, всички типове данни - обекти. Това осигурява семантика за импортиране и преименуване. За разлика от C ++ и Modula-3 вградени видове може да се използва като предшественици за разширяване на потребителя капацитет. Освен това, както в C ++, но не и в Modula-3, най-вграден оператори със специален синтаксис (аритметични оператори, индексиране, и т.н.) могат да бъдат заменени за случаите на класа.

Няколко думи за терминология

Прескачането на останалата част от света, поддържат се и терминологията е приложимо да се говори за класа, в този случай, аз ще говоря от гледна точка на C ++ и Smalltalk. (Бих предпочел да използвате езиковите Modula-3 срокове, тъй като Python е по-близо до своите обектно-ориентирани семантика, отколкото да се C ++, но предполагам, че няколко читатели са чували за него.)

Обектите имат идентичност, и един обект може да бъде свързан няколко имена (на множество сфери). Тази практика е в други езици, известни като комбинацията от имена (псевдоними). На пръв поглед комбинацията ненатрапчиво в Python, и може да се пренебрегне, без никакви последици по време на работа с основните типове неизменни (цифри, конци, кортежи). Въпреки това, имената на комбинацията от влияния върху семантиката на Python код софтуер, които работят с непостоянен обекти: списъци, речници и повечето видове като се описва естеството извън програмата (файлове, прозорци и др.) Обикновено подобна практика се счита за полезна, тъй като псевдоними действат като знаци и вероятно дори да надхвърлят възможностите си. Така например, прехвърляне на обекта - евтина операция, тъй като изпълнението на само показалеца се предава. Ако функцията променя предава като аргумент за даден обект, той ще бъде забележим и на мястото на повикване. Поради това, тя губи необходимостта от два различни аргумент преминаващите механизми.

Имена на полета видимост и пространство в Python

Преди да приемете класовете, което трябва да получите представа за правилата на обхват в Python. определения клас на имена правят няколко хитри трикове. За да се разбере напълно какво се случва, вие трябва да знаете за принципите на обхват и именни пространства. Това знание няма да пречи на всеки професионален програмист в Python.

Нека започнем с няколко дефиниции.

именно пространство (пространство от имена) - набор от връзки на имена на обекти. В момента по-голямата част от имена са реализирани като Python речници, но не се спирам на това (ако е само върху изпълнението): може би в бъдеще прилагането на промяната. Примери за пространства от имена: набор от вградени имена (функции като ABS (), както и вградени имена изключение); световните имена в модул; местни имена в извикване на функция. Важното е да се знае за именни пространства - е, че няма абсолютно никаква връзка между имена в различните пространства от имена, например, два различни модули може да бъде никакъв проблем да се определи функцията «максимизиране», тъй като модулите, потребителите ще използват името на модула като префикс ,

Входни атрибути могат да бъдат изключени (само за четене атрибут. Само за четене атрибут) или позволено (презаписваем атрибут. Писане атрибут). В последния случай, задача на атрибути е възможно. Атрибути модул може да се записва: можете да напишете "modname.the_answer = 42". Презаписваеми атрибути могат също така да бъдат изтрити дел оператор. Например, кодът "дел modname.the_answer" премахване the_answer атрибут на даден обект с modname за името.

Местната пространство от имена се създава, когато функцията се нарича и то се изтрива, когато функцията връща или извиква изключение, в него не прихванати. (В действителност, най-добрият начин да се обясни това, което се случва в действителност, би било "забравяйки"). Разбира се, рекурсивни поколение имат свой собствен пространство от имена на всеки.

Въпреки факта, че обхватът бил определен статично, те се използват динамично. Във всеки един момент по време на изпълнението, има най-малко три вложени обхват, чиито пространства от имена са на разположение директно: най-съкровената поле (за това се търси на първо място) съдържа местните названия; пространство от имена на всички места за гнездене на [код] функции, търсете, който започва с най-близкия околен [код] обхвата; обхват от среден клас, на него следващия работи търсенето и съдържа глобални имена текущата модула; и най-външния обхват (окончателния списък) - това е пространството от имена, съдържащи вградени имена.

Ако името е в световен мащаб са определени, а след това всички препратки и назначения отиват директно в обхват от среден клас, съдържащ световни имена модул. За смяна на свързването на всички променливи са намерени извън най-съкровената поле, можете да използвате оператора нелокални; ако тази променлива не е декларирано като нелокални. тя се използва само за четене (опит да се напише стойност на променлива създава нова локална променлива в най-вътрешната поле, оставяйки идентично име променлива външно непроменен).

Обикновено местната обхвата референцията местните имената на тока (на равнището на текста) функция. Отвъд локалния обхват на функция с референция към пространството от имена като глобалния обхват: пространството от имена на модул. определения клас се поставят в местен обхват друго пространство от имена.

Важно е да се осъзнае, че обхват са ограничени до нивото на текстова: глобалния обхват функция, дефинирана в модул е ​​пространството от имена на този модул, без значение от къде и от какво име се нарича тази функция. От друга страна, действителното търсене на имена се прави динамично, по време на изпълнение. Във всеки случай, тя може, езикът се ориентира към статично резолюция име (по време на компилация), така че не се разчита на динамична резолюция име. (Всъщност, местните променливи са вече определени статично.)

Специалният трик в Python е, че - с уговорката, че в тази област не включва глобални или нелокални оператори - наименуване винаги отиде в най-вътрешната поле. Задачи не копират данни и само на тях имена с обекти. Същото се отнася и за изтриване: операторът "дел х" премахва връзката на х пространство на имената, посочен от местния поле. В действителност, всички операции се въвеждат нови имена да използват местен обхват: по-специално, декларации за внос и функционални дефиниции свързват модула или името на функция в местен обхват, съответно. (За да посочите конкретна променлива, тя трябва да бъде поставен в глобалния обхват, глобален изявление може да се използва.)

глобалната твърдение може да се използва за деклариране на някои променливи, като свързана с глобалния обхват и показва, че преразпределянето им трябва да се извършва в нея; нелокални оператор бележи променливи като обвързани с околната обхвата и показва, че преразпределянето им трябва да се извършва в нея.

Пример области на видимост и именни пространства

Ето един пример, който показва как можете да се обърнете към различен обхват и именни пространства и как глобалното и нелокални повлиява свързването на променливата.

код извежда от пример е както следва: