Python从构造函数继承

Python从构造函数继承,python,inheritance,parent-child,subclass,super,Python,Inheritance,Parent Child,Subclass,Super,person.py class Person: """---A class representing a person---""" # Person constructor def __init__(self,n,a): self.full_name = n self.age = a class Student(Person): # Student constructor

person.py

class Person:
   """---A class representing a person---"""
   # Person constructor
   def __init__(self,n,a): 
       self.full_name = n
       self.age = a
class Student(Person):
    # Student constructor   
    def __init__(self,n,a,s):
       Person.__init__(self,n,a)
       self.school = s
driver.py

from person import *
    a = Student("Alice", 19, "Univ")
它抛出
TypeError:\uuuu init\uuuuu()接受3个位置参数,但给出了4个
我尝试将学生课程改为以下内容:

class Student(Person):
        # Student constructor   
        def __init__(self,n,a,s):
           super().__init__(n,a)
           self.school = s
错误仍然存在

为什么会发生这种情况?添加新属性是否需要
super()
关键字

编辑:问题解决了。呈现这种奇怪行为的源代码中存在缩进问题,因此应该结束该问题。

这一行:

Person.\uuuuu init\uuuuuuu(self,n,a)
这就是问题所在。回想一下,方法会自动传递一个对其自身的引用,所以您只传递了第二个引用

这方面也有一个公认的模式:

班级人员
定义初始(自我、姓名、年龄):
self.name=名称
self.age=年龄
班级学生(人):
定义初始(自我,学校,*args):
super()
自我学校
学生=学生(‘华盛顿小学’,“约翰尼·戈特姆”,10)
尽管需要注意的是,只需在
个人中删除对
自我的引用即可


请注意,您可以使用两个在某些情况下非常有用的装饰器来覆盖默认方法行为。这两种方法都不适用于此,但只需一点知识就可以让你的大脑轻松一点:

def SomeClass:
attr=“类作用域”
定义初始化(自):
self.attr=“实例范围”
定义某些_方法(自身):
return self.attr==“实例范围”
@类方法
定义某些类方法(cls):
返回cls.attr==“类作用域”
@静力学方法
def some_staticmethod():
return“我根本没有被赋予“self”参数!”
classmethod
s作为替代构造函数特别有用

班级人员:
定义初始(自我、姓名、年龄):
self.name=名称
self.age=年龄
@类方法
def来自_tuple(cls,tup)->“个人”:
“”“需要(姓名、年龄)的元组并构造一个人”“”
姓名,年龄=tup
返回cls(姓名、年龄)
@类方法
来自dict(cls,dct)->“人员”的定义:
“”“需要一个键为“name”和“age”的字典,并构造一个人”“”
尝试:
name=dct['name']
年龄=dct[‘年龄’]
除KeyError外:
raise VALUERROR(f“Dictionary{dct}没有必需的键'name'和'age')
其他:
返回cls(姓名、年龄)

我认为问题不在于构造函数本身……而在于我编写的源代码中的一些错误缩进。我无意中为注释添加了空格或制表符,这在逻辑上会导致糟糕的行为。移除空间后,一切正常。我就是不知道在Python中缩进或空格是如何计算的@Jerry213缩进将改变行为,但鉴于您发布的代码,您提到的错误消息是预期的,其缩进似乎是正确的。考虑Python中的空白,相当于爪哇/c中的大括号——这将有帮助: