Это происходит потому, что вы установили свои атрибуты эмулировать приватные переменные, давая им __
префикс. Python управляет этими переменными и затрудняет доступ к ним из других классов. Вы можете легко решить вашу проблему, не делая их «частными»:
class Employee:
def __init__(self,name,salary = 1500):
self.name = name
self.salary = salary
class Professor(Employee):
def __init__(self,name,salary):
Employee.__init__(self,name,salary)
self.salary = self.salary * 3
Если по каким-то причинам действительно нужно иметь их быть «частные» переменные, вы можете получить доступ к ним в подклассе так: self._Employee__salary
class Employee:
def __init__(self,name,salary = 1500):
self.__name = name
self.__salary = salary
class Professor(Employee):
def __init__(self,name,salary):
Employee.__init__(self,name,salary)
self._Employee__salary = self._Employee__salary * 3
Если вы хотите иметь зарплату по умолчанию для объектов профессор, вы должны явно добавить, что в __init__
функции Professor
:
class Professor(Employee):
def __init__(self,name,salary = 1500):
Employee.__init__(self,name,salary)
self._Employee__salary = self._Employee__salary * 3
что касается вопроса о наследовании значения параметров по умолчанию: вы не можете это сделать, так как вы пересматриваете __init__
в йо ur Professor
класс (что имеет смысл, поскольку вы расширяете его функциональность). Вы можете как-то обойти эту проблему с параметрами по умолчанию, но это не очень красиво, и я бы не рекомендовал его:
class Employee:
def __init__(self,name,salary):
self.__name = name
if salary == None:
self.__salary = 1500
else:
self.__salary = salary
class Professor(Employee):
def __init__(self,name,salary = None):
Employee.__init__(self,name,salary)
self._Employee__salary = self._Employee__salary * 3
С помощью этого кода вы все еще получаете ту же ошибку: '__init __() недостающую 1 необходимую позиционную аргумент: «salary''. Я пытаюсь найти решение, но проблема все та же, позиционная 'зарплата = 1500' не входит в подкласс' Профессор', поэтому мы по-прежнему получаем позиционную ошибку. При создании экземпляра класса 'Professor' он работает, если вы вставляете позиционный аргумент, например' tony = Professor ('tony', 100) ' –
Я не знаю, какую из кодовых версий вы говорите, но Я не ошибаюсь. – Keiwan
О, мы говорили о двух разных ошибках: D Да, функция '__init__' в профессоре не унаследована от Employee. И поскольку аргумент 'зарплата' не имеет значения по умолчанию в« Профессор », вы должны явно передать значение зарплаты при создании экземпляра объекта Professor. – Keiwan