Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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 如何在OOP中添加到实例变量,但不将其作为列表返回?_Python_Python 3.x_Class_Oop - Fatal编程技术网

Python 如何在OOP中添加到实例变量,但不将其作为列表返回?

Python 如何在OOP中添加到实例变量,但不将其作为列表返回?,python,python-3.x,class,oop,Python,Python 3.x,Class,Oop,我是python的OOP初学者,因为我在学校还没有学过。我了解基本知识,就像你可以拥有self.variables,而且每次使用一个类时,它们都是不同的。但我不知道如何添加这些变量,如下所示: class Person: def __init__(self, fname, sname): self.fname = fname self.sname = sname self.fullname = '{} {}'.format(fname,

我是python的OOP初学者,因为我在学校还没有学过。我了解基本知识,就像你可以拥有
self.variables
,而且每次使用一个类时,它们都是不同的。但我不知道如何添加这些变量,如下所示:

class Person:

    def __init__(self, fname, sname):
        self.fname = fname
        self.sname = sname
        self.fullname = '{} {}'.format(fname, sname)
        self.email = '{}.{}@email.com'.format(fname, sname)


class Teacher(Person):

    def __init__(self, fname, sname, subject):
        super().__init__(fname, sname)
        self.subjects = subject

    def add_subject(self, sub):
        self.subjects.append(sub)

    def del_subject(self, sub):
        self.subjects.delete(sub)


class Student(Person):

    def __init__(self):
        super().__init__(fname, sname)
        pass


t1 = Teacher('John', 'Becker', 'Maths')
print(t1.fullname)
t1.add_subject(input("Add Subject: "))
print('Subjects: ')
for i in t1.subjects:
    print("=====> "+i)
当我运行代码时:

John Becker
Add Subject: A
Traceback (most recent call last):
  File "C:/Desktop/Documents/YEAR 9/Computing/test.py", line 32, in <module>
    t1.add_subject(input("Add Subject: "))
  File "C:/Desktop/Documents/YEAR 9/Computing/test.py", line 17, in add_subject
    self.subjects.append(sub)
AttributeError: 'str' object has no attribute 'append'
约翰·贝克尔 添加主题:A 回溯(最近一次呼叫最后一次): 文件“C:/Desktop/Documents/YEAR 9/Computing/test.py”,第32行,在 t1.添加主题(输入(“添加主题:”) 文件“C:/Desktop/Documents/YEAR 9/Computing/test.py”,第17行,添加主题 self.subjects.append(sub) AttributeError:“str”对象没有属性“append” 我还观看了Corey Schafer在Youtube上的教程,我确保复制他的代码风格,准确地复制他是如何做到的,但当我运行它时,结果仍然不一样。
我曾尝试将
self.subjects=subject.split(“”
)进行拆分,这是可行的,但如果我打印t1的主题,它会打印一个列表。有没有办法更改
课堂教师:
中的代码,以便主题以字符串形式返回,而不是每次都键入
print(subjects.join(“”)


编辑:忽略
class Student
,该操作未完成,并且
def del_subject

subject变量在u_init_uuuuuuu中启动,并使用第三个变量。在您的示例中,这被设置为“数学”,一个字符串。也许这需要一个主题列表?在这种情况下,您需要将列表传递给构造函数。然后主题将是一个列表,当您调用add_subject时,append将起作用

t1 = Teacher('John', 'Becker', ['Maths'])
print(t1.fullname)
t1.add_subject(input("Add Subject: "))

这里的主要问题在于
教师的构造函数中。例如
t=Teacher('John','Doe','math')
意味着
t.subjects
'math'
,而不是
['math']

要解决此问题,您可以将其更改为:

 class Teacher(Person):
     def __init__(self, fname, sname, subject):
         ...
         self.subjects = [subject]
或者你也可以

 class Teacher(Person):
     def __init__(self, fname, sname, *subjects):
         ...
         self.subjects = list(subjects)
这会给老师一份通过的科目表。所以你应该

 >>> t = Teacher('John', 'Doe', 'math')
 >>> t.subjects
 ['math']

 >>> t2 = Teacher('Jane', 'Smith', 'history', 'biology')
 >>> t2.subjects
 ['history', 'biology']

对于
delu subject
方法,您需要使用
列表。删除
方法。
list
类没有方法
delete

作为初学者,最简单的方法是:

class Teacher(Person):

    def __init__(self, fname, sname, *subject):
        super().__init__(fname, sname)
        self.subjects = list(subject)

    def get_subjects(self):
        return ' '.join(self.subjects)
您可以使用

return ','.join(self.subjects)        

但在将列表传递给构造函数时要小心。复制列表通常是一个更好的主意,否则很难跟踪谁有能力修改列表。@EdwardMinnix如果传递列表文字,则不是问题。但是是的,应该小心。看,
self.subjects
可以是
列表
str
,作为
列表
是有意义的。为了方便起见,你可以添加一个
def show\u subjects(self)
方法,该方法只需打印
print('''.join(subjects))
。你的
Student
构造函数不正确。你需要将其设置为
def\u init\uuuu(self,fname,sname)
@juanpa.arrivillaga谢谢你,刚编辑了我的答案来解决这个问题