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