Python类有方法“set”,如何引用内置集类型?

时间:2010-02-03 21:52:53

标签: python

如果你在一个类中有一个名为“set”的方法,并且想要在类的其他地方创建一个标准的内置“set”对象,Python似乎在我这样做时引用了该方法。你怎么能更具体地让Python知道你的意思是内置的“集合”,而不是方法“设置”?更具体地说,set()是在_____exit_____函数中创建的。

5 个答案:

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