2012-02-16 89 views
3

我想知道的Python調用時,我用的是=如何在python中重新定義=?

a = b 

哪裏找這些資料?

我將有「賦值給變量」與我=

一會也有類似的行爲

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

爲什麼你想重新定義賦值操作?這只是要求麻煩。 – 2012-02-16 20:08:00

+3

這是你可以不厭其煩地吼叫「那不是* PYTHONIC !!! *」的時代之一嗎?**不管「pythonic」是什麼意思? – BoltClock 2012-02-16 20:08:31

+0

嚴重的問題:你會用它做什麼? – AndiDog 2012-02-16 20:16:27

回答

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 

我不知道是哪個內置功能,您必須ovverride(XXX)。 我認爲這是使用元類的獨特方式。

13

你不能在Python重新定義=。它將始終將右側的對象綁定到左側的名稱。

請注意,這與例如C++,其中=運算符通常涉及將數據複製到目標變量。 Python在C++中沒有變量。 Python具有可以綁定到對象的名稱。

+2

+1:我們有驚人的相似的答案:-) – 2012-02-16 20:10:10

+0

我會改變=的行爲。我想嘗試模擬C++如何使用C++ – fege 2012-02-16 20:22:08

+6

然後使用C++。 – 2012-02-16 20:24:21

4

你不能在Python中覆蓋=。您可以看到您可以在文檔中覆蓋的special methods列表,並且該列表中沒有任何與=匹配的列表。

Python始終將名稱空間中的名稱綁定到值。這意味着Python沒有「賦值給變量」,它只有「綁定到值」:沒有數據是副本,而是將另一個引用添加到相同的值。

0

如果您在班級內,則可以覆蓋它。

例如:

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

然後:

A().foo = 'bar' 

將輸出:

setting foo to bar 

請記住,這隻會修改一個類,而不是整個程序。

+0

如果此對象在分配操作的** LHS **上,請在頂部 – fege 2012-02-20 12:32:01

+0

中添加註釋,是的。但不是** RHS ** – smci 2013-03-15 04:48:58

7

你不能重新定義=,但你可以重新定義

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

分別實現__setitem____setattr__,執行此操作。對於屬性,使用property通常更合適,但__setattr__有其用處。