Как в __init__ обратиться к классу, например, если тот может наследоваться?

Рейтинг: 0Ответов: 2Опубликовано: 04.08.2023
class Parrent:
    varOfClass = None
    def __init__(self):
        Parrent.varOfClass = 1234 #?????
        #self.class.varOfClass = 1234 ?????

class ChildClass(Parrent):
    def __init__(self):
        super.__init__(self)

У меня есть класс с переменной, которая участвует в методах класса, но необходимо, чтобы наследники класса пользовались переменной с идентичным названием, но сами в себе, и не трогали класс родителя, как это можно осуществить?

Ответы

▲ 1Принят

Можно использовать type(self) или self.__class__:

class Parent:
    varOfClass = None
    def __init__(self):
        type(self).varOfClass = 1234
        # Или то же самое
        # self.__class__.varOfClass = 1234

class Child(Parent):
    def __init__(self):
        super().__init__()
        type(self).varOfClass = 5678
        # Или то же самое
        # self.__class__.varOfClass = 5678


Parent()
Child()

print(Parent.varOfClass)
print(Child.varOfClass)

или, возможно, более ясным способом будет вынести манипуляции с переменными класса в classmethod, и дёргать его из __init__:

class Child(Parent):
    
    def __init__(self):
        super().__init__()
        self.set_class_vars()
    
    @classmethod
    def set_class_vars(cls):
        cls.varOfClass = 5678
▲ 1

Нужно создать условно-приватный атрибут:

class Parent:
    __varOfClass = None
    
    def __init__(self):
        self.__varOfClass = 1234

Добавить геттер и сеттер:

class Parent:
  # ...
  
  def get_var_of_class(self):
      return self.__varOfClass
      
  def set_var_of_class(self, value):
      self.__varOfClass = value

Условно переопределить в __init__ дочернего класса переменную

class Child(Parent):
    def __init__(self):
        self.varOfClass = 5678
        super().__init__()

Использовать геттер/сеттер родительского класса для доступа к его переменной:

child = Child() 
print(child.get_var_of_class()) # выведет 1234
child.set_var_of_class(1111) # установит значение в классе Parent
print(child.varOfClass) # выведет 5678