我可以使用内置名称作为 Python class 的方法名称吗?

Can I use a builtin name as a method name of a Python class?

我有一个执行一些简单数据操作的 class,我需要三个方法:set、add、sub:

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" 方法上,但将其定义为 class 方法不应与 "set()" 内置函数冲突。

Python Style Guide 指出函数和方法的参数名称不应隐藏内置函数,但方法名称就是这种情况吗?

显然我可以选择另一个方法名称,但这个问题对于其他可能的方法名称(即 filter、sum、input)更通用和有效。

你很好。如果内置方法是内置方法,您只是不想覆盖它们 __init__ __iter__等等,除非您正在实现这些方法所期望的功能。

您是 "overwriting" 作为 class 方法的内置 函数 ,这意味着您并没有真正覆盖任何内容。这是可以接受的。

Namespaces are one honking great idea - 在这种情况下相同,名称 set 已定义,但它仅存在于限于 Entry class 的命名空间中,并且不会与内置函数冲突名字.

不隐藏内置名称的全部意义在于您不想阻止自己使用它们,因此当您的代码这样做时:

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

你仍然可以访问内置 set 所以没有冲突,唯一的问题是如果你想在 class 定义中使用 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'

在 class 定义中 - 并且只有 - 是隐藏的内置名称,因此您必须考虑您更愿意接受哪个:您需要使用 set 的不太可能的情况定义一个 class 范围变量并得到一个错误或为你的方法使用一个非直观的名称。

另请注意,如果您喜欢使用对您有意义的方法名称,并且还想在您的 class 定义中使用 set,您仍然可以使用 builtins.set 访问它 python 3 或 __builtin__.set 对于 python 2.