【问题标题】:python inheritance of class that have init argument具有init参数的类的python继承
【发布时间】:2022-01-08 04:52:34
【问题描述】:
class Salary:
    def __init__(self, basic_salary_table):
        self.basic_salary_table = basic_salary_table
        pass

    def basic_salary(self):
        if self.grade == 0:
            if self.level > 50:
                return int(self.basic_salary_table[3][self.basic_salary_table[3]['level']==50]['basic_salary'])
            return int(self.basic_salary_table[3][self.basic_salary_table[3]['level']==self.level]['basic_salary'])
        else:
            self.grade = str(self.grade)+'grade'
            return int(self.basic_salary_table[0][self.basic_salary_table[0]['level']==self.level][self.grade])

class Person(Salary):
    def __init__(self, name, id, job, level, grade=0):
        self.name = name
        self.id = id
        self.job = job
        self.level = level
        self.grade = grade

当我将 Person 对象创建为 person1 时,然后调用 person1.basic_salary() 解释器说,“Person”对象没有“basic_salary_table”属性

【问题讨论】:

  • 你还没有从Person.__init__ 调用Salary__init__(),所以Salary.__init__ 定义的任何东西当然都没有在你的Person 实例上定义。
  • 我不知道怎么做,因为你没有将basic_salary_table 传递给Person 构造函数。那应该从哪里来?是全球性的吗?
  • 一般来说,你会将它传递给Person 构造函数,但它也可以是一个全局变量。
  • 不过,您的继承有点奇怪;一个人通常不被视为薪水。
  • 你的意思是,我应该为 Person 的每个对象包含 basic_salary_table,对吧?

标签: python class inheritance init


【解决方案1】:

你需要在子类的__init__方法中执行super().__init__方法。

object.__init__

在创建实例之后(由 __new__())调用,但在它返回给调用者之前。参数是传递给类构造函数表达式的参数。如果基类具有 __init__() 方法,则派生类的 __init__() 方法(如果有)必须显式调用它以确保正确初始化实例的基类部分;例如:super().__init__([args...])

像这样:

class A:

    def __init__(self, a):
        self.a = a

    def print_a(self):
        print(self.a)


class B(A):

    def __init__(self, a, b):
        self.b = b
        super().__init__(a)


B(1, 2).print_a()

# 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    相关资源
    最近更新 更多