2010-02-03 105 views
1

如果你在一個類中有一個叫做「set」的方法,並且希望在類的其他地方創建一個標準的內置「set」對象,Python似乎在我這樣做時引用了方法。你如何更具體地讓Python知道你的意思是內建的「set」,而不是「set」方法?更具體地說,set()是在_____exit_____函數中創建的。Python類有方法「set」,如何引用內建的set類型?

+0

你的問題沒有意義,一種方法不能影響內建(除非你不放代碼:類範圍),所以你看到什麼問題*?怎麼了? – u0b34a0f6ae 2010-02-03 21:59:29

+1

+1這是一些代表,但通過點擊最能幫助您的答案旁邊的檢查來感謝那些幫助您的人。 – 2010-02-03 22:00:28

+0

一些示例代碼會很有幫助。 – 2010-02-04 01:59:40

回答

10

我想我知道這裏發生了什麼。你在做這樣的事嗎?

>>> class A(object): 
...  def set(self): 
...    pass 
...  def test(self, x=set): 
...    return x 
... 
>>> set 
<type 'set'> 
>>> A().test() 
<function set at 0x64270> 

由於方法在類中定義的方式,這是一個微妙的問題。這是什麼讓你做出方法別名這麼容易,例如,

class A(object): 
    def some_method(self): 
     pass 
    some_other_method = some_method 

您可以把set在類定義的底部,或者你可以參考使用__builtins__.set內建集。

+0

另一個選擇是'def test(self,x = None):','如果x是None:x = set'。 – 2011-11-15 23:02:43

2

通常方法名稱與全局名稱不同,因爲您必須以self.爲前綴。

所以self.set()調用你的類方法,set()調用全局set

如果這沒有幫助,也許發佈你有問題的代碼。

3

對象屬性爲總是通過引用進行訪問,因此無法爲對象屬性投影內建對象。

2

您可以參考內置作爲__builtins__.set

1

如果您運行下面的代碼,您會注意到UsesSet類的set方法不會掩蓋內置集合類型。

class UsesSet(object): 
    def set(self): 
     pass 
    def other(self): 
     my_set = set([1, 2]) 
     print type(my_set), my_set 

obj = UsesSet() 
obj.other() 

上面的代碼輸出<type 'set'> set([1, 2])表明我們班的set()方法並沒有隱藏內置set()

然而,如果你在你已經定義了一個名爲功能設置如下圖所示模塊一些不同的情況:

def set(arg): 
    print "This is my own set function" 

class UsesSet(object): 
    def other(self): 
     my_set = set([1, 2]) 
     print type(my_set), my_set 

obj = UsesSet() 
obj.other() 

上述輸出的代碼:

This is my own set function 
<type 'NoneType'> None 

因此,您可以看到與內置相同名稱的模塊級別函數隱藏了內置函數。