Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python - Access to a protected member _ of a class

Given a class with some protected members and a public interface to modify them, when is it generally accepted to access the protected members directly? I have some specific examples in mind:

  1. Unit testing
  2. Internal private methods such as __add__ or __cmp__ accessing other's protected attributes
  3. Recursive data structures (e.g. accessing next._data in a linked list)

I don't want to make these attributes public as I don't want them touched publicly. My syntax IDE syntax highlighting keeps saying that I'm wrong with accessing protected members - who is right here?

EDIT - adding a simple example below:

class Complex:
    def __init__(self, imaginary, base):
        self._imaginary = imaginary
        self._base = base

    def __str__(self):
        return "%fi + %f" % self._base, self._imaginary

    def __add__(self, other):
        return Complex(self._imaginary + other._imaginary, self._base + other._base)

Pycharm highlights other._imaginary and other._base with the following:

Access to a protected member _imaginary of a class

like image 487
Raven Avatar asked Mar 11 '17 13:03

Raven


People also ask

How do I access protected members in Python?

Protected variables are those data members of a class that can be accessed within the class and the classes derived from that class. In Python, there is no existence of “Public” instance variables. However, we use underscore '_' symbol to determine the access control of a data member in a class.

How do you access a protected member function of a class?

Protected members in a class are similar to private members as they cannot be accessed from outside the class. But they can be accessed by derived classes or child classes while private members cannot.

Can we access protected member outside the class in Python?

Protected members of a class are accessible from within the class and are also available to its sub-classes. No other environment is permitted access to it.

How protected members are accessed?

Protected members that are also declared as static are accessible to any friend or member function of a derived class. Protected members that are not declared as static are accessible to friends and member functions in a derived class only through a pointer to, reference to, or object of the derived class.


1 Answers

Solved - the problem was actually to do with lack of type-hinting. The below now works:

class Complex:
    def __init__(self, imaginary, base):
        self._imaginary = imaginary
        self._base = base

    def __str__(self):
        return "%fi + %f" % self._base, self._imaginary

    def __add__(self, other):
        """
        :type other: Complex
        :rtype Complex:
        """
        return Complex(self._imaginary + other._imaginary, self._base + other._base)
like image 131
Raven Avatar answered Sep 18 '22 08:09

Raven