如何根据Python类/对象的值更改其一个或多个属性

如何根据Python类/对象的值更改其一个或多个属性,python,python-3.x,Python,Python 3.x,我想创建一个Python类,它存储学生的姓名、姓氏和成绩,并检查成绩是否在正确的范围内(0-10) 有没有办法将大于10的属性更改为0(不是一个接一个) 您可以使用属性和setter,并防止setter中出现错误的值: class Student: def __init__(self, name, programming ): self.name = name self.programming = programming # using the sette

我想创建一个Python类,它存储学生的姓名、姓氏和成绩,并检查成绩是否在正确的范围内(0-10)

有没有办法将大于10的属性更改为0(不是一个接一个)


您可以使用属性和setter,并防止setter中出现错误的值:

class Student:
    def __init__(self, name, programming ):
        self.name = name
        self.programming = programming # using the setter so our business rule is applied

    @property
    def programming(self):
        return self._programming

    @programming.setter
    def programming(self,n):
        # apply the businessrule of n being in 1 to 10 else 0
        self._programming = n if 0 < n < 11 else 0


studs = [ Student("Enya",20), Student("Eric",0), Student("Karl",5)]

for s in studs:
    print(s.name, s.programming)

有关@property的更多信息,请访问

Yes。请参阅:。或者,您可以将所有这些属性存储在dictionary
student.marks
中,并对我刚才添加的属性进行迭代,当使用getter和setter时,属性
编程本身应该(按惯例)“private”,也就是说,
self.\u programming=programming
@MichalPolovka你不能给getter的backing变量起相同的名字-我使用了一个
的约定,这个约定表示“私有性”-所以我不太明白你的意思。@MichalPolovka和
\uu init\uuuuu(self)中的赋值
如果有目的地使用属性setter-因此应用了业务规则-您可以直接使用私有规则,但这样您就避免了setter业务规则的实现,这将使您在一开始使用时变得愚蠢。。。
class Student:
    def __init__(self, name, programming ):
        self.name = name
        self.programming = programming # using the setter so our business rule is applied

    @property
    def programming(self):
        return self._programming

    @programming.setter
    def programming(self,n):
        # apply the businessrule of n being in 1 to 10 else 0
        self._programming = n if 0 < n < 11 else 0


studs = [ Student("Enya",20), Student("Eric",0), Student("Karl",5)]

for s in studs:
    print(s.name, s.programming)
Enya 0
Eric 0
Karl 5