Как переопределить = в Python? - PullRequest
       30

Как переопределить = в Python?

3 голосов
/ 17 февраля 2012

Я бы хотел знать, что вызывает Python, когда использую =:

a = b

Где я могу найти эту информацию?

У меня будет "присваивание переменным" с моим =

a будет иметь подобное поведение

l=list()  
l.append(1)  
l.append(2)  
l.append(3)  
l1=l  
l1[2] = ’B’  
print(l1)  
[1, 2, ’B’]  
print(l)  
[1, 2, 3]

Ответы [ 5 ]

13 голосов
/ 17 февраля 2012

Вы не можете переопределить = в Python.Он всегда будет привязывать объект с правой стороны к имени с левой стороны.

Обратите внимание, что это сильно отличается от, например, C ++, где оператор = обычно включает копирование данных вцелевая переменная.В Python нет переменных в том смысле, в каком они есть в C ++.У Python есть имена, которые можно привязать к объектам.

7 голосов
/ 17 февраля 2012

Вы не можете переопределить =, но вы можете переопределить:

a[c] = b
   or
a.c  = b

Сделайте это путем реализации __setitem__ или __setattr__ соответственно.Для атрибутов часто более целесообразно использовать property, но __setattr__ имеет свои применения.

5 голосов
/ 17 февраля 2012

Вы не можете переопределить = в Python.Вы можете увидеть список специальных методов , которые вы можете переопределить в документации, и в этом списке нет ничего, что соответствовало бы =.

Python всегда связывает имя в вашем пространстве имен со значением,Это означает, что Python не имеет «присваивания переменным», он имеет только «привязку к значениям»: нет копируемых данных, вместо этого к этому значению добавляется другая ссылка.

0 голосов
/ 21 февраля 2012

Или, может быть, вы можете сделать так:

def funct(obj):  
        import copy  
        print('entro')  
        return str(copy.deepcopy(obj))   
class metacl(type):  
        def __new__(meta,classname,supers,classdict):  
                classdict['__xxx__'] = funct  
                return type.__new__(meta,classname,supers,classdict)  
class list(list,metaclass=metacl): pass

Я не знаю, какую встроенную функцию вы должны ovverride ( xxx ). Я думаю, что это единственный способ использовать метакласс.

0 голосов
/ 17 февраля 2012

Вы можете переопределить его, если находитесь внутри класса.

Например:

class A(object):
    def __setattr__(self,name,value):
        print 'setting', name, 'to', value

Тогда:

A().foo = 'bar'

Будет выводить:

setting foo to bar

Имейте в виду, это изменит только один класс, а не всю вашу программу.

...