我不知道如何解释我的问题,所以我会尽我所能
我有基类Price
:
class Price:
def __init__(self, contractid, *args, **kwargs):
self.contractid = contractid
我有一堆从Price
派生的类。每个子类都需要参数Price
以及一些附加参数。例如
class BestAvailablePrice(Price):
def __init__(self, contractid, sell_type)
super().__init__(contractid)
self.sell_type = sell_type
class MaxInvestedPrice(Price):
def __init__(self, contractid, n_shares, cumulative=True)
super().__init__(contractid)
self.n_shares = n_shares
self.cumulative = cumulative
....
使用super().__init__(contractid)
的问题是,如果Price.__init__()
发生变化,我也需要更新我的所有子类。例如,如果我决定Price还需要一个marketid
参数:
class Price:
# new __init__ method includes marketid argument
def __init__(self, contractid, marketid, *args, **kwargs):
self.contractid = contractid
self.marketid = marketid
然后我不得不返回并更新所有的子类
我一直在做的事情是声明一个setup_init_args(*args, **kwargs)
方法,并在其中定义其他参数:
class Price:
def __init__(self, contractid, *args, **kwargs):
self.contractid = contractid
self.setup_init_args(*args, **kwargs)
def setup_init_args(*args, **kwargs)
pass # overridden in subclasses
class BestAvailablePrice:
def setup_init_args(sell_type)
self.sell_type = sell_type
这将正确设置我的基本对象的属性,我可以使用工厂方法实例化我的对象:
marketid = 1000
contractid = 2020
def get_price_object(obj, *args, **kwargs):
return obj(marketid, contractid, *args, **kwargs)
bap = get_price_object(BestAvailablePrice, sell_type = 'sell')
如果我更改基类的init方法,我只需要在工厂方法中更改它。这是可行的,我会得到正确的对象,但是
我可以做到:
def get_price_object(obj, *args, **kwargs) -> Price:
但它认为我只得到了一个价格对象。我曾尝试使用python类型库中的TypeVar,但似乎无法实现。使用# type: BestAvailablePrice
设置某些内容是一种解决方法,但并不理想
BestAvailablePrice
当我键入bap = get_price_object(BestAvailablePrice, )
时,我希望看到BestAvailablePrice对象所需的附加参数。有没有办法让它出现?我有几十种价格类型,很难记住哪个类需要哪个参数
如果您同意在调用时始终使用关键字参数,则子类不必从
Price
复制命名参数。请记住,它不识别的任何关键字参数都会添加到kwargs
中以进行传递。通过使__init__
的所有参数仅为关键字,您可以坚持使用关键字参数注意
Price.__init__
也应该使用super
来处理多重继承,其中Price
不一定是MRO中object
之前的最后一个类。如果你做的很好,当调用object.__init__
时,**kwargs
将是空的关于工厂方法,您可以添加适当的类型提示:
尽管这可能无助于IDE建议预期的参数名称
相关问题 更多 >
编程相关推荐