如果你在一个类中有一个名为“set”的方法,并且想要在类的其他地方创建一个标准的内置“set”对象,Python似乎在我这样做时引用了该方法。你怎么能更具体地让Python知道你的意思是内置的“集合”,而不是方法“设置”?更具体地说,set()是在_____exit_____函数中创建的。
答案 0 :(得分:10)
我想我知道这里发生了什么。你在做这样的事吗?
>>> class A(object):
... def set(self):
... pass
... def test(self, x=set):
... return x
...
>>> set
<type 'set'>
>>> A().test()
<function set at 0x64270>
由于在类中定义方法的方式,这是一个微妙的问题。它允许您轻松地创建方法别名,例如,
class A(object):
def some_method(self):
pass
some_other_method = some_method
您可以将set
放在类定义的底部,也可以使用__builtins__.set
引用内置集。
答案 1 :(得分:3)
对象属性始终通过引用访问,因此对象属性无法遮蔽内置函数。
答案 2 :(得分:2)
通常,方法名称会从全局名称中消除歧义,因为您必须加前缀self.
。
因此self.set()
会调用您的类方法,set()
会调用全局set
。
如果这没有帮助,可能会发布您遇到问题的代码。
答案 3 :(得分:2)
您可以将内置set
称为__builtins__.set
。
答案 4 :(得分:1)
如果您运行下面的代码,您会注意到set
类的UsesSet
方法不会掩盖内置集类型。
class UsesSet(object):
def set(self):
pass
def other(self):
my_set = set([1, 2])
print type(my_set), my_set
obj = UsesSet()
obj.other()
上面的代码输出 <type 'set'> set([1, 2])
,表明我们班级的set()
方法没有隐藏内置set()
但是,如果你有一个模块,你在其中定义了一个名为set的函数,如下所示:
def set(arg):
print "This is my own set function"
class UsesSet(object):
def other(self):
my_set = set([1, 2])
print type(my_set), my_set
obj = UsesSet()
obj.other()
上面的代码输出:
This is my own set function
<type 'NoneType'> None
因此,您可以看到与内置名称相同的模块级别功能隐藏了内置功能。</ strong>