Home > Enterprise >  Does call to super(A, A()).__init__ depends on first parameter of super method?
Does call to super(A, A()).__init__ depends on first parameter of super method?

Time:09-12

I came across this thread. As suggested in the comments I tried this code

class WritableSerializerMethodField(serializers.SerializerMethodField):
    def __init__(self, method_name=None, **kwargs):
        self.method_name = method_name
        kwargs['source'] = '*'
        super(serializers.SerializerMethodField, self).__init__(**kwargs)

    def to_internal_value(self, data):
        print('Data: ', data)
        return {'profile': data}

It did the job. I decide to replace super(serializers.SerializerMethodField, self).__init__(**kwargs) with super().__init__(**kwargs) and I got KeyError

profile_data = validated_data.pop('profile')
KeyError: 'profile'

I realised this call is different in a way that first argument to super is serializers.SerializerMethodField not WritableSerializerMethodField.

What difference this makes?

More simplified code:

class One:
    def func(self):
        print("I am parent.")


class Two(One):
    def func(self):
        print("I am child.")

What is the difference between super(Two, Two()) and super(One, Two())?

CodePudding user response:

Those two super calls aren't equivalent.

super(serializers.SerializerMethodField, self).__init__()

calls __init__() of SerializerMethodField's parent - the grandparent of WritableSerializerMethodField, whereas

super().__init__()

just calls __init__() of WritableSerializerMethodField's parent, i.e., SerializerMethodField.

  • Related