У класса Python есть метод "set", как ссылаться на встроенный тип set? - PullRequest
1 голос
/ 04 февраля 2010

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

Ответы [ 5 ]

10 голосов
/ 04 февраля 2010

Мне кажется, я знаю, что здесь происходит.Вы делаете что-то вроде этого?

>>> 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.

3 голосов
/ 04 февраля 2010

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

2 голосов
/ 04 февраля 2010

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

2 голосов
/ 04 февраля 2010

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

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

.

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

1 голос
/ 04 февраля 2010

Если вы запустите приведенный ниже код, вы заметите, что метод 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...