Python 将子类传递给导入的库

Python 将子类传递给导入的库,python,Python,我有一个库,它返回一些半抽象对象的集合 class Item1(object): pass class Item2(object): pass class Collection1(object): pass class Provider(object): def retrieve_collection(self): col = Collection1() col.add(Item1()) col.add(Item

我有一个库,它返回一些半抽象对象的集合

class Item1(object):
    pass
class Item2(object):
    pass
class Collection1(object):
    pass 

class Provider(object):
    def retrieve_collection(self):
        col = Collection1()
        col.add(Item1())
        col.add(Item2())
        return col
它只是填充对象的属性,这些项/集合类打算在调用方代码中进行子类化

所以会有一些脚本

from mylib import Provider, Item1
class MyItem(Item1):
    pass
provider = Provider()
col = provider.retrieve_collection()
问题是,将MyItem(和任何其他子类)传递给提供者的优雅和python解决方案是什么

我可以将它作为
Provider(item1=MyItem)
传递,将其存储为
self.item1
,然后将其实例化为
self.item1()
,而不是
item1()
,但这似乎很糟糕。另外,我会在客户端代码中进行可怕的长构造函数调用

另一个选项是重写模块级的类,如
mylib.Item1=MyItem
,但这可能会导致许多意外的、难以调试的问题。此外,可能有几个不同的提供者类使用相同的项基类,但需要来自客户端的不同子类


也许是某种形式的类注册和工厂,而不是实际的类?因此,ITEM1()将尝试根据某个上下文来计算实例化哪个类,但我不确定它是如何工作的。

,你会认为这是多余的吗?< /P>

class Provider(object):
    def retrieve_collection(self, type0=Item1, type1=Item2):
        col = Collection1()
        col.add(type0())
        col.add(type1())
        return col


col = provider.retrieve_collection(MyItem)

mylib.py

class Item1(object):
    def __repr__(self):
        return "Base Item1"
class Item2(object):
    def __repr__(self):
        return "Base Item2"
class Collection1(set):
    pass 

class Provider(object):
    Item1=Item1
    Item2=Item2
    def retrieve_collection(self):
        col = Collection1()
        col.add(self.Item1())
        col.add(self.Item2())
        return col
class Item1(object):
    def __repr__(self):
        return "Base Item1"
class Item2(object):
    def __repr__(self):
        return "Base Item2"
class Collection1(set):
    pass 

class Provider(object):
    Item1=Item1
    Item2=Item2
    def retrieve_collection(self):
        col = Collection1()
        col.add(self.Item1())
        col.add(self.Item2())
        return col

def ProviderFactory(**kw):
    return type('Provider', (Provider,)+Provider.__bases__, kw)

输出:

Collection1([Base Item2, Base Item1])
Collection1([Base Item2, Subclass Item1])
Collection1([Base Item2, Subclass Item1])

mylib.py

class Item1(object):
    def __repr__(self):
        return "Base Item1"
class Item2(object):
    def __repr__(self):
        return "Base Item2"
class Collection1(set):
    pass 

class Provider(object):
    Item1=Item1
    Item2=Item2
    def retrieve_collection(self):
        col = Collection1()
        col.add(self.Item1())
        col.add(self.Item2())
        return col
class Item1(object):
    def __repr__(self):
        return "Base Item1"
class Item2(object):
    def __repr__(self):
        return "Base Item2"
class Collection1(set):
    pass 

class Provider(object):
    Item1=Item1
    Item2=Item2
    def retrieve_collection(self):
        col = Collection1()
        col.add(self.Item1())
        col.add(self.Item2())
        return col

def ProviderFactory(**kw):
    return type('Provider', (Provider,)+Provider.__bases__, kw)

输出:

Collection1([Base Item2, Base Item1])
Collection1([Base Item2, Subclass Item1])
Collection1([Base Item2, Subclass Item1])

好的,这与在提供者实例化时设置它们是一样的,但在我的例子中,情况会更糟,因为提供者方法在整个代码中都被调用,而实例化只发生几次。