如何在python中重新定义=?

时间:2012-02-16 20:06:39

标签: python methods operators operator-overloading redefine

当我使用=

时,我想知道Python调用了什么
a = b

我在哪里查找此信息?

我将使用my =

进行“赋值给变量”

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 个答案:

答案 0 :(得分:13)

您无法在Python中重新定义=。它总是将右侧的对象绑定到左侧的名称。

请注意,这与例如C ++,=运算符通常涉及将数据复制到目标变量。 Python没有C ++所具有的变量。 Python具有可以绑定到对象的名称。

答案 1 :(得分:7)

您无法重新定义=,但可以重新定义:

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

分别通过实施__setitem____setattr__来实现。对于属性,使用property通常更合适,但__setattr__有其用途。

答案 2 :(得分:5)

您无法在Python中覆盖=。您可以在文档中看到可以覆盖的special methods列表,并且该列表中没有与=匹配的内容。

Python总是将名称空间中的名称绑定到值。这意味着Python没有“赋值给变量”,它只有“绑定到值”:没有数据是副本,而是另一个引用被添加到相同的值。

答案 3 :(得分:0)

如果您在课堂内,可以覆盖它。

例如:

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

然后:

A().foo = 'bar'

输出:

setting foo to bar

请记住,这只会修改一个类,而不是整个程序。

答案 4 :(得分:0)

或许你可以这样做:

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

我不知道你必须使用哪个内置函数( xxx )。 我认为这是使用元类的独特方式。