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

12

Я создаю 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 jldupont
Error: User Rate Limit Exceeded bob morane

Ваш Ответ

2   ответа
1

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

Error: User Rate Limit Exceeded bob morane
Error: User Rate Limit Exceededfrom base_classes import Bookcollection as BaseBookcollection!
18

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

Error: User Rate Limit Exceeded

Похожие вопросы