首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这种情况下,我可以避免使用exec()吗?

在这种情况下,我可以避免使用exec()吗?
EN

Stack Overflow用户
提问于 2021-11-17 15:01:42
回答 2查看 97关注 0票数 1

出于某些原因(例如),我有一个类以以下方式继承了另一个类

代码语言:javascript
复制
    class student():
        def __init__(self,Name_,Grade_):
             self.Name=Name_
             self.Grade_=Grade
        #Some other code
    
    class Classroom(student):        
        def __init__(self,Class_Name_,Class_Supervisoir_,list_of_students_Names_,
        List_of_Students_Grades_):
             self.Class_Name=Class_Name_
             self.Class_Supervisoir=Class_Supervisoir_
             self.list_of_students_Names=list_of_students_Names_
             self.List_of_Students_Grades=List_of_Students_Grades_
             for _,__ in enumerate(self.List_of_Students_Grades):
                   exec("self.Student_"+str(__)+"=student("+str(__)+","+str(
                   self.List_of_Students_Grades[_])+")"

我想从类“学生”中创建一些实例,但作为类的一部分,“教室”,即可以在self.student中引用。

然而,我不知道输入的学生的数量(可以是很多),我想为他们中的每个人创建一个对象,如下所示:

代码语言:javascript
复制
self.Student_Mark=student(mark,20)
self.Student_Peter=student(peter,15)
...

以此类推。

然后问题是,我想做一个像上面那样的赋值语句,但我不能不使用exec()函数来做这件事,我已经读到了在生产级别使用exec()函数的安全风险,那么我如何才能用具有相同功能的东西来替换这里的exec()呢?

EN

回答 2

Stack Overflow用户

发布于 2021-11-17 15:09:50

有点框架性的问题:为什么教室是学生的子班?教室是一个房间,但更重要的是,教室(由于显而易见的原因,不能真正称其为class )代表一组学生、一个教师/主管和一个名字。因此,创建一组学生,而不是每个学生的变量:

代码语言:javascript
复制
class Classroom:
    def __init__(self, name, supervisor, students, grades):
        self.name = name
        self.supervisor = supervisor
        self.students = []
   
        # do it here
        for name, grade in zip(students, grades):
             self.students.append(student(name, grade))

此外,使用___作为您使用的值是一个相当大的危险信号。通常,_被用作向开发人员发出不使用值的信号:

代码语言:javascript
复制
# we don't use the values produced by range, so
# the _ is a throwaway
five_students = [student('tom', 100) for _ in range(5)]

# now we use the value, so use a name for it
five_students = [student('tom', grade) for grade in range(95, 100)]
票数 3
EN

Stack Overflow用户

发布于 2021-11-17 15:13:00

我不知道你为什么要这样命名你的属性。但是你可以使用setattr。另外,我不认为这是一次性变量的好用例,相反,你可以这样写:

代码语言:javascript
复制
for ix, name in enumerate(self.List_of_Students_Grades):
    setattr(
        self, 
        f"Student_{name}", 
        student(name, self.List_of_Students_Grades[index])
    )
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70006780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档