Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以使用内置名称作为Python类的方法名吗?_Python_Pep8 - Fatal编程技术网

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

我可以使用内置名称作为Python类的方法名吗?,python,pep8,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):

我有一个类可以执行一些简单的数据操作,我需要三个方法: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()”内置函数冲突

声明函数和方法的参数名不应隐藏内置函数,但方法名是这样吗


显然,我可以选择另一个方法名,但这个问题对于其他可能的方法名(即筛选、求和、输入)更为通用和有效。如果内置函数是一个内置方法,那么您就不想覆盖它们,除非您正在实现这些方法所期望的功能


您正在“覆盖”作为类方法的内置函数,这意味着您没有真正覆盖任何内容。这是可以接受的。

-在这种情况下,name
set
已定义,但它仅存在于限定为
Entry
类的命名空间中,并且与内置函数名不冲突。

不隐藏内置名称的全部原因是,您不想阻止自己使用它们,因此,当您的代码执行此操作时:

x.set(a) #set the value to a
b = set((1,2,3)) #create a 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
,您仍然可以使用python 3的
内置.set
或python 2的
\builtin\uuu.set
来访问它。

应该不是什么问题,因为方法名称在python中总是限定的。“如果它们是一个内置方法”让我感到困惑,我认为术语是
\uuuu init\uuuu
\uuuu iter\uuuuu
等是神奇的方法(因为它们在某些场景中被隐式调用)这是真的。但是,有些人不喜欢称它们为神奇方法,因为它们并不神奇,也就是说,你可以覆盖它们或在自己的类中创建它们,它们会在你编写它们时工作。因此,如果你用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu通常使用。@Tadhgmandald Jensen我本可以说dunder方法,这可能会更清楚。我试图使用适合这个问题的术语。这可能不是最好的决定。