Python中类的非直观输出

时间:2017-11-03 15:26:49

标签: python

所以我上了这堂课:

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

如果你的回答,请给我一个简短的解释,说明为什么它不起作用

2 个答案:

答案 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方法。