我有一个执行一些简单数据操作的类,我需要三个方法: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”方法,但将其定义为类方法不应与“set()”内置函数冲突。
Python Style Guide表明函数和方法的参数名称不应该影响内置函数,但方法名称就是这种情况吗?
显然我可以选择另一个方法名称,但问题更通用,对其他可能的方法名称有效(即过滤,求和,输入)。
答案 0 :(得分:4)
关于不隐藏内置名称的全部内容是,您不希望阻止自己使用它们,所以当您的代码执行此操作时:
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'
在类定义中 - 并且只有 - 内置名称是阴影,因此您必须考虑您愿意解决的问题:您需要使用set
来定义类范围变量的不太可能的情况并为您的方法获取错误或使用非直观的名称。
另请注意,如果您希望使用对您有意义的方法名称并且还希望在类定义中使用set
,则仍可以使用builtins.set
访问python 3或__builtin__.set
对于python 2。
答案 1 :(得分:1)
你是"覆盖"一个内置的函数作为一个类方法,这意味着你并没有真正覆盖任何东西。这是可以接受的。
答案 2 :(得分:1)
Namespaces are one honking great idea - 在这种情况下,名称set
已定义,但它仅存在于仅限于Entry
类的名称空间中,并且不会与内置函数名冲突。