Если у вас есть метод, называемый "set" в классе, и вы хотите создать стандартный встроенный "установленный" объект где-то еще в классе, Python, похоже, ссылается на этот метод, когда я это делаю. Как вы можете быть более конкретным, чтобы Python знал, что вы имеете в виду встроенный "набор", а не метод "set"? Более конкретно, set() создается в функции _____exit_____.
Думаю, я знаю, что происходит здесь. Вы делаете что-то вроде этого?
>>> 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
.
def test(self, x=None):
if x is None: x = set
.
Атрибуты объектов всегда доступны через ссылку, поэтому нет возможности привязать атрибут объекта к встроенной структуре.
Обычно имена методов неоднозначны от глобальных имен, потому что вы должны префикс self.
.
Итак, self.set()
вызывает ваш метод класса, а set()
вызывает глобальный set
.
Если это не помогает, возможно, разместите код, с которым вы столкнулись.
Вы можете сослаться на встроенный set
как __builtins__.set
.
Если вы запустите приведенный ниже код, вы заметите, что метод 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
Итак, вы можете видеть функцию уровня модуля с тем же именем, что и встроенный, скрывающий встроенный.