有沒有辦法阻止一些但不是所有的參數被髮送到超類?是否可以選擇哪些kwargs傳遞給Python中的超類?
我有一個驗證用戶輸入的基類:從Base
class Base(object):
def __init__(self, **kwargs):
self.kwargs = kwargs
super(Base, self).__init__()
@staticmethod
def check_integrity(allowed, given):
"""
Verify user input.
:param allowed: list. Keys allowed in class
:param given: list. Keys given by user
:return:
"""
for key in given:
if key not in allowed:
raise Exception('{} not in {}'.format(key, allowed))
>>> base = Base()
>>> print base.__dict__
output[0]: {'kwargs': {}}
A
繼承和使用方法,以檢查它的關鍵字
class A(Base):
def __init__(self, **kwargs):
super(A, self).__init__(**kwargs)
self.default_properties = {'a': 1,
'b': 2}
self.check_integrity(self.default_properties.keys(), kwargs.keys())
>>> a = A(a=4)
>>> print a.__dict__
output[1]: {'default_properties': {'a': 1, 'b': 2}, 'kwargs': {'a': 4}}
我還要提到的是我已經拉出我在這個類中用於更新類屬性的另一種方法,因爲它是一個與問題無關的併發症(因此在上例中爲什麼a
未更新爲4
)
在問題出現時,試圖從A
繼承和增加額外kwargs
子類:
class B(A):
def __init__(self, **kwargs):
super(B, self).__init__(**kwargs)
self.default_properties = {'a': 2,
'c': 3,
'd': 4}
self.check_integrity(self.default_properties.keys(), kwargs.keys())
>>> b = B(d=5)
Traceback (most recent call last):
File "/home/b3053674/Documents/PyCoTools/PyCoTools/Tests/scrap_paper.py", line 112, in <module>
b = B(d=5)
File "/home/b3053674/Documents/PyCoTools/PyCoTools/Tests/scrap_paper.py", line 96, in __init__
super(B, self).__init__(**kwargs)
File "/home/b3053674/Documents/PyCoTools/PyCoTools/Tests/scrap_paper.py", line 92, in __init__
self.check_integrity(self.default_properties.keys(), kwargs.keys())
File "/home/b3053674/Documents/PyCoTools/PyCoTools/Tests/scrap_paper.py", line 84, in check_integrity
raise Exception('{} not in {}'.format(key, allowed))
Exception: d not in ['a', 'b']
這裏d
被傳遞到超類,即使它只是在子類必須的。但是,a
和b
自變量用於A
,應該從B
轉換爲A
。
'del kwargs ['d']'? –
需要通過'kwargs'來超類那些不在'self.default_properties'.Is this your expectation @CiaranWelsh? – Rajez
我想從'B()。default_properties()'''''''''a'和'b'從B()。default_properties()'傳遞給'A',而不是'd'。 – CiaranWelsh