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

时间:2016-08-30 14:14:33

标签: python pep8

我有一个执行一些简单数据操作的类,我需要三个方法: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表明函数和方法的参数名称不应该影响内置函数,但方法名称就是这种情况吗?

显然我可以选择另一个方法名称,但问题更通用,对其他可能的方法名称有效(即过滤,求和,输入)。

3 个答案:

答案 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)

你很好。如果内置方法是 __ init __ __ iter __ 等,除非您正在实现这些方法所期望的功能,否则您不想覆盖内置方法。

你是"覆盖"一个内置的函数作为一个类方法,这意味着你并没有真正覆盖任何东西。这是可以接受的。

答案 2 :(得分:1)

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