Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
      Languages 
      Kernels 
      Packages 
      Books 
      Tests 
      OS 
      Forum 
      Математика 
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
 Linux Kernel 2.6...2334 
 Trees...1467 
 William Gropp...1422 
 Ethreal 3...1402 
 Ethreal 4...1384 
 C++ Patterns 3...1382 
 Максвелл 3...1371 
 Httpd-> История Ap...1371 
 Rodriguez 6...1366 
 Robert Love 5...1365 
 Go Web ...1365 
 Максвелл 5...1364 
 OS ->Intel Manual 1...1362 
 Ext4 FS...1362 
 K&R 1...1361 
 Kamran Husain...1360 
 Rubni-Corbet -> Глав...1358 
 Perl OOP...1356 
 Erlang...1354 
 Стивенс 9...1354 
 
  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.
Оставьте свой комментарий !

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

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