Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Scala中产生非法循环引用错误的故障是什么?为什么?_Python_Scala_Oop_Computer Science - Fatal编程技术网

Python 在Scala中产生非法循环引用错误的故障是什么?为什么?

Python 在Scala中产生非法循环引用错误的故障是什么?为什么?,python,scala,oop,computer-science,Python,Scala,Oop,Computer Science,我试图从基本面的角度来理解它。这个问题很幼稚,但答案将为进入OOP或新编程范式的人们带来更多的清晰 它是从python开始的,当时我尝试使用一些OOP示例代码,如下所示: class Student(ScienceStudent): def __init__(self): self.name = input("Enter name") self.age = input("Enter age") def

我试图从基本面的角度来理解它。这个问题很幼稚,但答案将为进入OOP或新编程范式的人们带来更多的清晰

它是从python开始的,当时我尝试使用一些OOP示例代码,如下所示:

class Student(ScienceStudent):

    def __init__(self): 
        self.name = input("Enter name")
        self.age = input("Enter age")

    def put_data(self):
        print(self.name)
        print(self.age)

class ScienceStudent(Student):

    def science(self):
        print("This person knows science")

student1 = Student()
student2 = ScienceStudent()

student1.put_data()
student2.put_data()
student2.science()
student1.science()
这导致了错误:

Traceback (most recent call last):
File "xyz.py", line 1, in <module>
class Student(ScienceStudent):
NameError: name 'ScienceStudent' is not defined
HelloWorld.scala:20: error: illegal cyclic reference involving class Student
我得到了一个错误:

Traceback (most recent call last):
File "xyz.py", line 1, in <module>
class Student(ScienceStudent):
NameError: name 'ScienceStudent' is not defined
HelloWorld.scala:20: error: illegal cyclic reference involving class Student

现在,我想听听。

Scala中的一个特定原因(忽略继承图中有一个循环的本体论含义)扩展类
B
的类
a
的构造函数必须始终调用类
B
的构造函数,以便初始化从
B
继承的
a
的任何状态。如果你是你父亲的儿子,你父亲怎么可能是你的儿子?很简单,子类化表示类之间的继承关系(这反过来会导致相应类型上的类似子类型关系)。-因此,如果
ScienceStudent
是一种更具体的
ScienceStudent
,你不能说
ScienceStudent
是一种更具体的
ScienceStudent
。正如编译器所解释的,您有一个循环引用。或者换句话说,这就是强类型语言的工作方式,Python不是强类型语言。@LuisMiguelMejíaSuárez是这样的吗?我们只有在需要进一步分类/分段时才使用继承?如果两个用于不同目的的不同类可以找到一些相互方便/可交换的方法,那么为什么不能这样做呢?@lousycoder继承有两个目的:多态性,更准确地说是子类型多态性。代码重用,这实际上应该是一个结果,而不是一个目标,但许多人为此而使用它,这通常会导致糟糕的设计不确定您认为他们的方法相互方便/可交换是什么意思?想提供一个例子吗?@lousycoder“组合重于继承”在这里,你已经找到了这个问题的答案,以及所有与继承相关的糟糕设计的问题。-另外,你的例子在建模方面不是很好,一个儿子和一个父亲都是人,那是他们的班级。您不会为程序中的每个实体创建一个类,而是为每种实体创建一个类。