12

Вопрос по python – Как переписать импортированный класс Python для всех вызовов

Я создаю python-packages / MyLibPackage, который я буду импортировать в мои проекты.

MyLibPackage.____init____.py включает в себя mymodiciation.py. Кроме того, папка MyLibPackage содержит еще один файл: base_classes.py (= внешний проект)

mymodiciation.py import & quot;from base_classes import *& Quot ;.

Цель: Я могу импортировать MyLibPackage, который имеет все классы из base_classes (= внешний проект). И если мне нужно изменить некоторые классы или функции, я могу перезаписать это в mymodiciation.py. Это работает, но у меня есть проблема. Например:

Я перезаписываю эти классы в mymodiciation.py:

class Bookcollection(Bookcollection):
   new_member = "lalala"


class user(user):
   def get_books(self):
      return Bookcollection()

если я сделаю:

from MyLibPackage import *
x = user()
books = x.get_books()

тогда объект Bookcollection имеет свойство «new_member». Хорошо! Но если я сделаю это:

from MyLibPackage import *
x = shelf() #this class is not overwritten and used also the object "Bookcolelction"
books = x.get_books()

тогда объект Bookcollection НЕ имеет свойства & quot; new_member & quot; потому что он инстанцируется с MyLibPackage.base_classes.Bookcollection, а не с моим перезаписанным классом MyLibPackage.mymodiciation.Bookcollection

Как я могу сказать: если я перезаписываю класс в mymodiciation, MyLibPackage должен использовать это, хотя, когда вызов приходит из MyLibPackage.base_classes.shelf (get_books).

  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от bob morane
  • Error: User Rate Limit Exceededfrom base_classes import Bookcollection as BaseBookcollection!

    от
  • Error: User Rate Limit Exceeded

    от jldupont
  • Error: User Rate Limit Exceeded

    от bob morane
  • 1

    Иметь классы с одинаковыми именами

    как правило, плохая идея, поскольку вы сталкиваетесь с конфликтами в пространстве имен. Я бы порекомендовал изменить вашMyLibPackage.base_classes.Bookcollection вMyLibPackage.base_classes.BaseBookcollection или похожие. Это должно тогда работать как ожидалось.

  • 18

    Error: User Rate Limit Exceeded

    import base_classes
    
    class Bookcollection(base_classes.Bookcollection):
       new_member = "lalala"
    
    base_classes.Bookcollection = Bookcollection
    

     import base_classes
    
     base_classes.Bookcollection.new_member = "lalala"
    
     def new_bookcol_method(self):
          pass
    
     # to replace or register a method in the other class:
     base_classes.Bookcollection.__dict__["old_bookcol_method"] = new_bookcol_method
    

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

    В общем, вы должны либо сделать, как подсказывает @jamesj в своем ответе, и использовать разные классы, либо, если вам нужно динамическое поведение, использовать для этого поддерживаемую среду, например Zope Component Architecture. И какой бы подход вы ни выбрали,do