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
Последние статьи :
  Эльбрус 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   
  SQL 30.07   
 
TOP 20
 Part 4...561 
 Part 3...547 
 Kamran Husain...341 
 Secure Programming for Li...241 
 Trees...237 
 2.0-> Linux IP Networking...234 
 Ext4 FS...224 
 Rodriguez 6...216 
 Stein-MacEachern-> Час...214 
 Steve Pate 3...201 
 Стивенс 9...195 
 Advanced Bash Scripting G...194 
 William Gropp...190 
 Cluster 4...189 
 Ethreal 1...188 
 Instructions 2...184 
 Python...181 
 Gary V.Vaughan-> Libtool...180 
 Kamran Husain...179 
 Go Web ...178 
 
  01.12.2020 : 3018131+ посещений 

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.
Оставьте свой комментарий !

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

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