Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 Languages
 С
 GNU С Library 
 Qt 
 STL 
 Threads 
 C++ 
 Samples 
 stanford.edu 
 ANSI C
 Libs
 LD
 Socket
 Pusher
 Pipes
 Encryption
 Plugin
 Inter-Process
 Errors
 Deep C Secrets
 C + UNIX
 Linked Lists / Trees
 Asm
 Perl
 Python
 Shell
 Erlang
 Go
 Rust
 Алгоритмы
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 MINIX...3057 
 Solaris...2933 
 LD...2904 
 Linux Kernel 2.6...2470 
 William Gropp...2180 
 Rodriguez 6...2011 
 C++ Templates 3...1945 
 Trees...1936 
 Kamran Husain...1865 
 Secure Programming for Li...1791 
 Максвелл 5...1710 
 DevFS...1693 
 Part 3...1682 
 Stein-MacEachern-> Час...1632 
 Go Web ...1624 
 Ethreal 4...1618 
 Arrays...1606 
 Стивенс 9...1603 
 Максвелл 1...1592 
 FAQ...1538 
 
  01.01.2024 : 3621733 посещений 

iakovlev.org

Специальные методы

 
  В питоне есть несколько специальных встроенных методов .
 

Классы и обьекты

Пример: class foo: def __init__(self, n): print 'Constructor called' self.n = n def hello(self): print 'Hello world' def change(self, n): print 'Changing self.n' self.n = n f = foo(10) # создает обьект класса foo с членом 'n' = 10. print f.n # печатает 10. f.m = 20 # можно к обекту добавить новое поле ! f.hello() # печатает 'Hello world' foo.change(f, 40) print f.n # печатает 40 Метод __init__ похож на конструктор в C++. Это - один из специальных методов , который вызывается автоматически при создании обьекта. Мы видим , что все методы имеют параметр 'self'. И при вызове f.hello() параметром этого метода является обьект 'f'. Вместо 'self' может стоять другое слово . Возможно также вместо f.hello() вызвать foo.hello(f). Есть определенная связь между 'self' и ключевым словом 'this'(в C++).

Специальный метод __add__

Рассмотрим пример: class foo: def __init__(self, n): self.n = n def __add__(self, right): t = foo(0) t.n = self.n + right.n return t Создадим 2 обьекта - f1 , f2 - и сложим их : f1 = foo(10) # f1.n is 10 f2 = foo(20) # f2.n is 20 f3 = f1 + f2 print f3.n # prints 30 Что происходит при выполнении f1+f2 ? Фактически вызывается f1.__add__(f2). Поэтому 'self' в функции __add__ ссылается на f1 и 'right' ссылается на f2.

Другой вариант __add__

Пример : class foo: def __init__(self, n): self.n = n def __radd__(self, left): t = foo(0) t.n = self.n + left.n print 'left.n is', left.n return t f1 = foo(10) f2 = foo(20) f3 = f1 + f2 # печатает 'left.n is 10' В данном случае f1+f2 конвертируется в f2.__radd__(f1).

Самораспечатка обьекта - метод __str__

class foo: def __init__(self, n1, n2): self.n1 = n1 self.n2 = n2 def __str__(self): return 'foo instance:'+'n1='+`self.n1`+','+'n2='+`self.n2` Класс foo определяет специальный метод __str__. Пример: f1 = foo(10,20) print f1 # печатает 'foo instance: n1=10,n2=20'

Метод __nonzero__

__nonzero__ и __len__ реализованы для тестирования обьектов . Пример : class foo: def __nonzero__(self): return 0 class baz: def __len__(self): return 0 class abc: pass f1 = foo() f2 = baz() f3 = abc() if (not f1): print 'foo: false' # печатает 'foo: false' if (not f2): print 'baz: false' # печатает 'baz: false' if (not f3): print 'abc: false' # ничего не печатает

Метод __getitem__

В списках с поддержкой индесации возможна операция типа 'print a[i]'. В питоне есть специальный метод __getitem__ для поддержки индексации пользовательских обьектов. Пример: class foo: def __init__(self, limit): self.limit = limit def __getitem__(self, key): if ((key > self.limit-1) or (key < -(self.limit-1))): raise IndexError else: return 2*key f = foo(10) # f acts like a 20 element array print f[0], f[1] # prints 0, 2 print f[-3] # prints -6 print f[10] # generates IndexError Есть еще несколько дополнительных методов : __setitem__, __delitem__, __getslice__, __setslice__, __delslice__ .

Метод __getattr__

__getattr__(self,name) позволяет обрабатывать исключения в том случае , когда нужный атрибут класса не найден : class foo: def __getattr__(self, name): return 'no such attribute' f = foo() f.n = 100 print f.n # prints 100 print f.m # prints 'no such attribute' Имеется также встроенная функция getattr(object, name). Так, getattr(f, 'n') вернет 100 и getattr(f,'m') вернет строку 'no such attribute'. Следующий пример показывает реализацию делегирования : class Boss: def __init__(self, delegate): self.d = delegate def credits(self): print 'I am the great boss, I did all that amazing stuff' def __getattr__(self, name): return getattr(self.d, name) class Worker: def work(self): print 'Sigh, I am the worker, and I get to do all the work' w = Worker() b = Boss(w) b.credits() # prints 'I am the great boss, I did all that amazing stuff' b.work() # prints 'Sigh, I am the worker, and I get to do all the work'

Ссылки

Для начинающих хорошее руководство тут : tutorial. Еще здесь : language reference и здесь : library reference.
Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье