Gibt es eine Möglichkeit zu verhindern, dass einige, aber nicht alle Argumente an eine Superklasse gesendet werden?Ist es möglich, selektiv zu entscheiden, welche Kwargs in Python an eine Superklasse übergeben werden sollen?
Ich habe eine Basisklasse, die Benutzereingabe überprüft:
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
erbt von Base
und verwendet die Methode seiner Schlüsselwörter zu überprüfen
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}}
Ich sollte auch erwähnen, dass ich herausgezogen eine andere Methode, die ich in dieser Klasse für das Aktualisieren von Klasseneigenschaften verwendet habe, da es eine Komplikation ist, die für die Frage nicht relevant ist (daher wird a
nicht auf 4
im obigen Beispiel aktualisiert)
Das Problem kommt, wenn von A
und das Hinzufügen zusätzlicher kwargs
zu der Unterklasse zu erben versuchen:
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']
Hier d
wird an die übergeordnete Klasse übergeben, auch wenn seine nur in der Unterklasse erforderlich. Die Argumente a
und b
werden jedoch in A
verwendet und sollten von B
an A
übergeben werden.
'del kwargs ['d']'? –
Sie müssen 'kwargs' an die Superklasse übergeben, die nicht in' self.default_properties' enthalten sind. Ist das Ihre Erwartung @CiaranWelsh? – Rajez
Ich möchte 'a' und' b' von 'B(). Default_properties()' an 'A' übergeben werden, aber nicht' d' von 'B(). Default_properties()'. – CiaranWelsh