Что делает __contains__, что может вызвать функцию __contains__

Вот мой код:

class a(object):
    d='ddd'
    def __contains__(self):
        if self.d:return True
b=a()
print b.contains('d')  # error
print contains(b,'d')  # error

Ответы

Ответ 1

Как и все специальные методы (с "волшебными именами", которые начинаются и заканчиваются на __), __contains__ не, который должен быть вызван напрямую (за исключением очень конкретных случаев, таких как up = вызовы суперкласса): скорее, такие методы называются частью работы встроенных и операторов. В случае __contains__, рассматриваемый оператор in - оператор проверки сдерживания.

С вашим классом a, когда вы его представляете (кроме исправления вашей опечатки и используя True вместо True! -) и b в качестве своего экземпляра, print 'x' in b напечатает True - и так будет проверена любая другая проверка на b, так как b всегда возвращает True (потому что self.d, непустая строка, истинна).

Ответ 2

чтобы заставить ваш код что-то делать (хотя ничего полезного):

class a(object):
    d='ddd'
    def __contains__(self, m):
        if self.d: return True
b=a()

>>> 'd' in b
True

docs.

Ответ 3

if self.d:return true

self.d - строка 'ddd'. Непустые строки всегда правдивы: когда вы используете if на 'ddd', он всегда будет действовать так, как если бы вы сказали if True:.

Я думаю, что вы, вероятно, имели в виду:

def __contains__(self, item):
    return item in self.d

in - это оператор, который вызывает метод __contains__ за кулисами.

Ответ 4

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

class Person(object):
      def __init__(self,name,age):
          self.name = name
          self.age = age
      def __contains__(self,param1):
          return True if param1 in self.__dict__.keys() else False

>>> p = Person('Robby Krieger',23)
>>> 'name' in p
True  

Ответ 5

Давайте рассмотрим очень простой пример магического метода __ содержит __:

Предположим, что у меня есть класс Player, а мой метод __ init __ принимает один строковый аргумент name. В основном я создал объект (obj1) класса Player.

Теперь, если я хочу знать, содержит ли мой obj1 (в данном случае имя атрибута obj1) определенную строку, подстроку или алфавит, я должен реализовать __ содержит __ метод, как показано в примере.

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

   class Player():

    def __init__(self, name):
        self.name=name

    def __contains__(self, substring):
        if substring in self.name:
            return True
        else:
            return False

obj1=Player("Sam")
print ('am' in obj1)    ----> True
print ('ami' in obj1)   ----> False