2016-05-07 3 views
1

я создал класс Employee:Как чан атрибут подкласса на основе суперкласса

class Employee: 
    def __init__(self,name,salary = 1500): 
     self.__name = name 
     self.__salary = salary 

Затем я хочу определить подкласс профессора, заработная плата которых составляет 3 * заработная плата работника. Но мне нужно изменить зарплату моего подкласса на основе суперкласса.

class Professor(Employee): 
    def __init__(self,name,salary): 
     Employee.__init__(self,name,salary) 
     self.__salary = self.__salary*3 

но он бросает мне ошибку "

__init__() missing 1 required positional argument: 'salary'" 

Как я могу фиксируем, что?

ответ

3

Это происходит потому, что вы установили свои атрибуты эмулировать приватные переменные, давая им __ префикс. 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 
+0

С помощью этого кода вы все еще получаете ту же ошибку: '__init __() недостающую 1 необходимую позиционную аргумент: «salary''. Я пытаюсь найти решение, но проблема все та же, позиционная 'зарплата = 1500' не входит в подкласс' Профессор', поэтому мы по-прежнему получаем позиционную ошибку. При создании экземпляра класса 'Professor' он работает, если вы вставляете позиционный аргумент, например' tony = Professor ('tony', 100) ' –

+0

Я не знаю, какую из кодовых версий вы говорите, но Я не ошибаюсь. – Keiwan

+0

О, мы говорили о двух разных ошибках: D Да, функция '__init__' в профессоре не унаследована от Employee. И поскольку аргумент 'зарплата' не имеет значения по умолчанию в« Профессор », вы должны явно передать значение зарплаты при создании экземпляра объекта Professor. – Keiwan

Смежные вопросы