2012-09-05 14 views
0

我一直在學習Python中的魔術方法,而且一直在想,如果有勾勒出的具體操作方式:任何方法來表示對象分配?

a = MyClass(*params).method() 

對:是,也許

MyClass(*params).method() 

在這個意義上,我可能想要返回已在'\n'字符上拆分的列表,而將原始列表轉儲到變量a,以保持'\n'完好無損。

如果Python的下一個操作即將返回一個值給變量,並且改變操作,是否有方法可以使用?我在想:

class MyClass(object): 
    def __init__(params): 
     self.end = self.method(*params) 

    def __asgn__(self): 
     return self.method(*params).split('\n') 

    def __str__(self): 
     """this is the fallback if __asgn__ is not called""" 
     return self.method(*params) 

回答

4

不可以。您不能更改分配給裸名時發生的情況。

可以更改如果左側的分配目標是對象的屬性或項目會發生什麼情況。您可以使用__setitem__a.blah = ...__setattr__覆蓋a[blah] = ...(儘管您只能在a而不是在分配的對象上掛鉤)。但是你不能覆蓋或以任何方式影響a = ...

請注意,根據「將要發生的事情」,手邊的變化會更加陌生,而且非常糟糕。這將意味着

someFunc(MyClass().method()) 

可能比

a = MyClass().method() 
someFunc(a) 

在Python的名字只是標籤附着在物體上是不同的。物體不知道標籤貼在他們身上,這是件好事。您可能會將計算結果分配給中間變量,以使後續行更具可讀性,並且您不希望該分配更改該計算的結果。

+0

你看到任何*實用*使用它?或者我還只是在Python的中間階層工作? ';)' – Droogans

+0

然而,你可以改變+運算符的功能,如賦值或其他...不是很推薦,但...「a +」hello world「'可以改變'a'實例...不建議爲了任何需要維護的人的理智,你可以...... –

+0

@JoranBeasley哦......不,不,不,不。尋找已確立的東西,否則,它不是或不應該這樣做的原因。家庭釀造的捷徑最好留給獨奏藝術家。 – Droogans

0

應該有直接調用MyClass(*params).method()並將其分配給一個變量之間的區別。你可能在這裏看到的是你的解釋器自動打印返回結果,這就是爲什麼它看起來被拆分,而變量值包含EOL標記。

沒有辦法覆蓋默認賦值給變量。但是,通過使用一個對象,你可以很容易地提供自己的鉤子:

class Assigner(object): 
    def __init__(self, assignment_callback): 
     self.assignment = assignment_callback 

    def __setattr__(self, key, value): 
     if hasattr(self, 'assignment'): 
      value = self.assignment(value) 
     super(Assigner, self).__setattr__(key, value)  

def uppercase(value): 
    # example function to perform on each attribute assignment 
    return value.upper() 

然後在你的代碼,而不是分配給一個變量直接分配給你的對象屬性:

>>> my = Assigner(uppercase) 
>>> my.a = 'foo' 
>>> print my.a 
FOO 
相關問題