所以我上了这堂课:
class Student(object):
def __init__(self, studentID, name):
self.__studentID = studentID
self.__name = name
def set_studentID(self, value):
self.__studentID = value
def get_name(self):
return self.__name
并运行此代码:
x = Student
x.set_name(x, input("Name: "))
x.set_studentID(x, len(students))
students.append(copy.deepcopy(x))
x.set_name(x, input("Name: "))
x.set_studentID(x, len(students))
students.append(copy.deepcopy(x))
for i in (students):
print(i.get_name(i))
给出了意想不到的输出:
For the input:
a
b
the output is:
b
b
The expected output is:
a
b
如果你的回答,请给我一个简短的解释,说明为什么它不起作用
答案 0 :(得分:1)
您的代码无效的原因是因为从不实例化您的类,而是将类对象本身分配给名称x
x = Student
当你真的需要时
x = Student()
然后调用类对象上的方法,同时将类对象本身作为第一个参数传递,因此getter和setter作用于类对象。
最后,类是单例,copy
模块特殊情况。如果x
是一个类
copy.deepcopy(x) is x
永远是True
,因此你永远不会复制。
作为旁注,您的类定义看起来像是由Java开发人员首次使用Python编写的。 Pythonic的方法是not to use getters and setters使用属性,仅在需要时使用。另外,不要使用双下划线名称修改,除非你真的想要它,在这种情况下,你不要。
答案 1 :(得分:0)
另一个答案解释了为什么您的代码无法按预期工作。以下是如何以更加pythonic的方式重写代码。
class Student(object):
def __init__(self, studentID, name):
self.studentID = studentID
self.name = name
students = []
name = input("Name: ")
students.append(Student(len(students), name))
name = input("Name: ")
students.append(Student(len(students), name))
for student in students:
print(student.name)
除非必须进行一些特殊处理,否则不需要编写getter和setter方法。