使用继承从 __init__ 减少样板文件
Reduce boilerplate from __init__ using Inheritance
我正在尝试通过超级 class 注入构造函数,即 __init__
,以避免在我的所有域 class 中使用 __init__
中的样板代码。
例如:
class Structure:
_fields = []
def __init__(self, *args):
if len(args) != len(self._fields):
raise TypeError("Wrong # arguments")
for name, value in zip(self._fields, args):
setattr(self, name, value)
class Stock(Structure):
_fields = ['name', 'shares', 'price']
stock = Stock("Amzn", "11", "2100")
print(stock.name)
当构造函数限制为 *args
时,上面的代码可以正常工作。但是有些域 classes 也需要 **kwargs
。
例如如下所示:
class Structure:
_fields = []
def __init__(self, *args, **kwargs):
if (len(args) + len(kwargs)) != len(self._fields):
raise TypeError("Wrong # arguments")
for name, value in zip(self._fields, args):
setattr(self, name, value)
class Stock(Structure):
_fields = ['name', 'shares', 'price']
stock = Stock("Amzn", "11", price = "2100")
stock.price #AttributeError, stock object has no attribute 'price'
但显然上面的代码不会设置 kwargs,因为我在 __init__
中从未接触过 kwargs。知道如何解决这个问题吗?
如何检查 kwargs
是否存在?
>>> class SC:
...: _fields = []
...: def __init__(self, *args, **kwargs):
...: if (len(args) + len(kwargs)) != len(self._fields):
...: raise TypeError("Wrong # arguments")
...: for name, value in zip(self._fields, args):
...: setattr(self, name, value)
...: if kwargs:
...: self.__dict__.update(kwargs)
...:
>>> class SD2(SC):
... _fields = ['name', 'shares', 'price']
>>> i = SD2(name='Amzn', shares=1, price=2)
>>> i.name
'Amzn'
>>> i.shares
1
这也是这样工作的:
>>>u= SD2('Amzn', shares=1, price=2)
>>>u.name
'Amzn'
我正在尝试通过超级 class 注入构造函数,即 __init__
,以避免在我的所有域 class 中使用 __init__
中的样板代码。
例如:
class Structure:
_fields = []
def __init__(self, *args):
if len(args) != len(self._fields):
raise TypeError("Wrong # arguments")
for name, value in zip(self._fields, args):
setattr(self, name, value)
class Stock(Structure):
_fields = ['name', 'shares', 'price']
stock = Stock("Amzn", "11", "2100")
print(stock.name)
当构造函数限制为 *args
时,上面的代码可以正常工作。但是有些域 classes 也需要 **kwargs
。
例如如下所示:
class Structure:
_fields = []
def __init__(self, *args, **kwargs):
if (len(args) + len(kwargs)) != len(self._fields):
raise TypeError("Wrong # arguments")
for name, value in zip(self._fields, args):
setattr(self, name, value)
class Stock(Structure):
_fields = ['name', 'shares', 'price']
stock = Stock("Amzn", "11", price = "2100")
stock.price #AttributeError, stock object has no attribute 'price'
但显然上面的代码不会设置 kwargs,因为我在 __init__
中从未接触过 kwargs。知道如何解决这个问题吗?
如何检查 kwargs
是否存在?
>>> class SC:
...: _fields = []
...: def __init__(self, *args, **kwargs):
...: if (len(args) + len(kwargs)) != len(self._fields):
...: raise TypeError("Wrong # arguments")
...: for name, value in zip(self._fields, args):
...: setattr(self, name, value)
...: if kwargs:
...: self.__dict__.update(kwargs)
...:
>>> class SD2(SC):
... _fields = ['name', 'shares', 'price']
>>> i = SD2(name='Amzn', shares=1, price=2)
>>> i.name
'Amzn'
>>> i.shares
1
这也是这样工作的:
>>>u= SD2('Amzn', shares=1, price=2)
>>>u.name
'Amzn'