2016-08-30 107 views
5

我有一個執行一些簡單的數據操作類,我需要三個方法:設置,添加子:我可以使用內建名稱作爲Python類的方法名稱嗎?

class Entry(): # over-simplified but should be enough for the question 
    def __init__(self, value): 
     self.set(value) 
    def set(self, value): 
     self.value=value 
    def add(self, value): 
     self.value += value 
    def sub(self, value): 
     self.value -= value 

的問題是與「套」的方法,但將其定義爲一個類的方法不應該發生衝突用「set()」內建函數。

Python Style Guide指出函數和方法的參數名不應該影響內置函數,但方法名是這種情況嗎?

很明顯,我可以選擇另一個方法名稱,但問題對於其他可能的方法名稱(即過濾器,求和,輸入)更通用且有效。

+0

不應該真的成爲一個問題,因爲方法名稱總是在Python中限定的。 – khelwood

回答

2

約不遮蔽內建的名字,整個事情是,你不希望從能夠使用它們,所以當你的代碼做這個停止你的自我:

x.set(a) #set the value to a 
b = set((1,2,3)) #create a set 

你仍然可以訪問內置的set所以沒有衝突,唯一的問題是,如果你想使用set類定義

class Entry(): 
    def __init__(self, value): 
     self.set(value) 
    def set(self, value): 
     self.value=value 
    possible_values = set((1,2,3,4,5)) #TypeError: set() missing 1 required positional argument: 'value' 

裏面的類定義 - 而且只 - 是在b所以你必須考慮你寧願解決的問題:你嘗試在類定義中使用set並且得到一個錯誤或者爲你的方法使用非直觀的名字。

還要注意的是,如果你喜歡使用的方法名稱,讓你們感受到的,也希望在你的類定義中使用set你仍然可以用builtins.set訪問它的Python 3或__builtin__.set爲Python 2

1

你很好。除非您正在實現這些方法所期望的功能,否則您只是不想覆蓋內置方法,如果它們是內置方法__init____iter__ etc。

作爲類方法,您正在「覆蓋」一個內置的函數,這意味着您不是真的覆蓋任何東西。這是可以接受的。

+0

「如果它們是內置方法」使我困惑,我認爲術語是'__init__'和'__iter__'等是**魔術方法**(因爲它們在某些情況下被隱含地調用) –

+0

這是真的。然而,有些人不喜歡稱他們爲魔法,因爲他們不是魔法,AKA可以覆蓋他們或者在你自己的課堂上創建他們,他們會在你寫下他們的時候工作。因此,如果你用'__iter__'方法創建一個對象,它被python視爲一個* iterable *,並且可以在任何通常使用迭代器的地方使用。 – bravosierra99

+0

@ TadhgMcDonald-Jensen我本可以說dunder方法,而且可能更清楚。我試圖使用符合問題的術語。這可能不是最好的決定。 – bravosierra99

相關問題