В классе Python есть метод «set», как ссылаться на встроенный тип set?

1

Если у вас есть метод, называемый "set" в классе, и вы хотите создать стандартный встроенный "установленный" объект где-то еще в классе, Python, похоже, ссылается на этот метод, когда я это делаю. Как вы можете быть более конкретным, чтобы Python знал, что вы имеете в виду встроенный "набор", а не метод "set"? Более конкретно, set() создается в функции _____exit_____.

  • 0
    То, что вы спрашиваете, не имеет смысла, метод не может скрывать встроенную функцию (кроме случаев, когда вы не помещаете код: область видимости класса), так какую проблему вы видите ? Что происходит?
  • 2
    +1 Вот несколько представителей, но считается вежливым поблагодарить людей, которые помогают вам, нажав на флажок рядом с ответом, который вам больше всего помогает.
Показать ещё 1 комментарий
Теги:

5 ответов

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.

  • 0
    Другой вариант - def test(self, x=None): if x is None: x = set .
3

Атрибуты объектов всегда доступны через ссылку, поэтому нет возможности привязать атрибут объекта к встроенной структуре.

2

Обычно имена методов неоднозначны от глобальных имен, потому что вы должны префикс self..

Итак, self.set() вызывает ваш метод класса, а set() вызывает глобальный set.

Если это не помогает, возможно, разместите код, с которым вы столкнулись.

2

Вы можете сослаться на встроенный set как __builtins__.set.

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

Итак, вы можете видеть функцию уровня модуля с тем же именем, что и встроенный, скрывающий встроенный.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню