Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
from os.path import join
class FileObject:
def __init__(self, filepath='~', filename='sample.txt'):
self.file = open(join(filepath, filename), 'r+')
def __del__(self):
self.file.close()
del self.file
например вfrom os.path import join
class FileObject:
def init.core(self, filepath = '~', filename = 'sample.txt'):
self.file = open(join(filepath, filename), 'r+')
def del.core(self):
self.file.close()
del self.file
def parent.child(args))class Foo:
def core(self):
print('Foo')
class FileObject:
def del.core(self):
print('FileObject')
def del(self):
return Foo()
x.__init__(x) можно, а вот x.init.core(x) — уже нет, нету способа отличить это от 2х независимых вызовов.__init, __del и т.д.). Но это, на мой взгляд, менее красиво, да и выделение с одной стороны уже используется для name mangling.Исключая бинарные операции, программирование символами псевдографики — это истинное брэйнфакство.
import com.package.* items[5]x = 1class N():
def __init__(self, n):
self.n = n
def __add__(self, other):
return N(self.n + other.n)
def __repr__(self):
return '<N: %s>' % self.n
print sum([N(1), N(2), N(3)], N(0))
<N: 6>__nonzero__. Вызывается не только когда явно укажешь bool(object), но и просто if obj:bool() применяется к объекту «автоматически».if. Но, на самом деле, в обоих ваших примерах было бы странно ожидать от Питона какого-нибудь другого поведения, мне кажется :):о))all(iterable) и any(iterable) тоже вызывают bool неявным образом. .__next__(), который принят на вооружение взамен старому .next(). При этом, правильный метод в зависимости от версии питона, отлично вызывается встроенной функцией next().__hash__ используется не только для поиска по словарю, но и для проверки вхождения в множество (set()). Хотя, некоторые представляют себе множество словарём без значений… Технически это может и имеет смысл, но как-то совсем не интуитивно.__hash__ это просто дуаль встроенной функции hash, а уж кто и как ее использует — дело второе.class A(object):
def __hash__(self):
return 10
a = A()
>>> class A(object):
... def __hash__(self):
... print "i'm called, you are wrong"
... return 10
...
>>> a = A()
>>> v = {a: 10}
i'm called, you are wrong
hash. Любой может сделать свой контейнер и использовать там ф-ю hash, но это не повод писать "__hash__ используется не только для поиска по словарю и для проверки вхождения в множество, но и вот в этом моем контейнере".>>> class X(object):
... def __hash__(self):
... return 111111111111111111111111111111111111111111111
...
>>> x = X()
>>> hash(x)
891475464178347604
На самом деле, экземпляр объекта создаёт метод __new__, а затем аргументы передаются в инициализатор.filepath='~' понимается домашняя директория текущего пользователя, то это так не работает — будет попытка открыть файл в директории ./~/, т.к. Python не разворачивает шелл-подстановки (и спасибо ему). Чтобы работало, код нужно написать следующим образом: def __init__(self, filepath = '~', filename = 'sample.txt'):
# открыть файл filename в filepath в режиме чтения и записи
self.file = open(os.path.expanduser(os.path.join(filepath, filename)), 'r+')
__cmp__() и функции cmp(), и рекомендуется использовать __lt__/__gt__/__le__/__ge__/__eq__/__ne__ исключительно. Если нет необходимости определять все операторы сравнения, можно определить один оператор сравнения (например, __eq__) и один оператор упорядочения (например, __lt__), и применить к объявлению класса декоратор @functools.total_ordering — он достроит остальные функции на основании имеющихся.:о)
Руководство по магическим методам в Питоне