Реализуйте метод __contains__ на объекте класса - PullRequest
0 голосов
/ 02 января 2019

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

class ACN(object):
    @classmethod
    def get_acn_certs(cls):
        pass

    @classmethod
    def get_suppporting_cert(cls, domains):
        pass

    @classmethod
    def __contains__(cls, item):
        return True    
3 in ACN

Когда я запускаю вышеуказанный скрипт, он выдает следующую ошибку в последней строке. Как я могу реализовать __contains__ метод здесь

3 in ACN TypeError: argument of type 'type' is not iterable

Ответы [ 2 ]

0 голосов
/ 02 января 2019

Магические методы проверяются только на классе объекта (объявление их как методы класса здесь ничего не меняет), поэтому, когда вы делаете 3 in ACN, python ищет метод __contains__ (или __getitem__) на класс ACN (метакласс), который является встроенным классом type. Если вы хотите использовать класс ACN в качестве экземпляра и использовать магические методы, вы должны использовать собственный метакласс и определить для него магические методы:

class ACNType(type):
    def __contains__(cls, item):
        return True   


class ACN(metaclass=ACNType):
   # your other methods here
0 голосов
/ 02 января 2019

команда «3 в ACN» не будет работать, потому что вы объявили класс, но не создали его экземпляр.Если вы хотите создать класс, который будет одним экземпляром, я предлагаю вам прочитать немного о шаблоне Singleton .Вот еще немного информации для шаблона Singleton на python .Затем вы сможете использовать метод вроде get_instance () в локальной переменной и использовать его.Когда вы создаете объект из класса, он автоматически наследует класс Object и имеет , содержащий метод.Я хотел бы лучше понять, зачем вам это нужно?

...