Python 在Scala中产生非法循环引用错误的故障是什么?为什么?
我试图从基本面的角度来理解它。这个问题很幼稚,但答案将为进入OOP或新编程范式的人们带来更多的清晰 它是从python开始的,当时我尝试使用一些OOP示例代码,如下所示: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
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“组合重于继承”在这里,你已经找到了这个问题的答案,以及所有与继承相关的糟糕设计的问题。-另外,你的例子在建模方面不是很好,一个儿子和一个父亲都是人,那是他们的班级。您不会为程序中的每个实体创建一个类,而是为每种实体创建一个类。