Что делает __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