Python: как заставить метод класса взаимодействовать с методом экземпляра родительского класса - PullRequest
0 голосов
/ 15 апреля 2020

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

По сути, у меня есть оболочка mongodb, которая выглядит следующим образом:

class Model(dict):

    __getattr__ = dict.get
    __delattr__ = dict.__delitem__
    __setattr__ = dict.__setitem__

    def create(self):
        self.collection.insert(self)

Вот как я ее использую:

class Document(Model):
    collection = mongo.db.My_collection

x = Document({'Name': 'BOB', 'Age': 26})
x.create()

Теперь я хотел бы воспользоваться преимуществами методов класса, чтобы избежать создания экземпляров моих объектов. Вот подход, который я выбрал:

class Document(Model):
    collection = mongo.db.My_collection

    @classmethod
    def create_item(cls, item):
        cls.create(item)

Document.create_item({'Name': 'BOB', 'Age': 26})

Здесь я наследую от Model класса. Затем я создаю метод класса create_item. Наконец, я пытаюсь вызвать метод create родительского класса, но получаю ошибку:

AttributeError: 'dict' object has no attribute 'collection'

Итак, мои вопросы:

  • Как создать метод класса связаться с методом экземпляра родительского класса?
  • Во-вторых, какова была бы лучшая стратегия для реализации этих классов с использованием методов класса?

1 Ответ

1 голос
/ 17 апреля 2020

Сделать create classmethod

class Model(dict):
    __getattr__ = dict.get
    __delattr__ = dict.__delitem__
    __setattr__ = dict.__setitem__

    @classmethod
    def create(cls,item):
        #print(cls, cls.collection)
        cls.collection.insert(item)

# MY mongo.db.collection
class F:
    @staticmethod
    def insert(item):
        print(item)

class Document(Model):
    #collection = mongo.db.My_collection
    collection = F()

    @classmethod
    def create_item(cls, item):
        cls.create(item)

>>> Document.create_item({'Name': 'BOB', 'Age': 26})
{'Name': 'BOB', 'Age': 26}
>>>

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

Похоже, create может быть автономной функцией, не связанной с классом.

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