如果类属性在实例化后设置为某个值,则引发异常

2024-10-01 11:31:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个在运行时通过构造函数创建的类。有没有一种方法可以防止在构造之后将它的某些属性设置为某些值?你知道吗

例如,在下面的代码中,如果currRating的值设置为大于maxRating或小于minRating,我想引发一个异常。我可以在实例化过程中轻松地做到这一点,但是,我希望在类已经构建好之后再这样做。你知道吗

class Machine(object):
    def __init__(self,Name,maxRating,minRating,currRating=1):
        self.name=name
        self.maxRating = maxRating
        self.minRating = minRating
        self.currRating = currRating

我通读了之前关于StackOverflow的一些回复,并理解这对于Python老手来说可能是一个敏感的话题。我只是想知道是否有一种非黑客的方法可以在Python中实现这一点,或者这是Python不应该做的事情之一。


Tags: 实例方法代码nameself属性objectinit
2条回答

我可以这样试一下吗:

#!/usr/bin/python

class Machine(object):
    def __init__(self, Name, maxRating, minRating, currRating=1):
        self.name=Name
        self.maxRating = maxRating
        self.minRating = minRating
        self.currRating = currRating

    def __setattr__(self, name, value):
        if name in ["maxRating", "minRating"]:
            #raise TypeError, "You can't change this attribute: %s = %s" % (name, value)
            print "You can't change this attribute: %s = %s" % (name, value)
        self.__dict__[name] = value

obj = Machine("Grinder", 5, 1)

try:
    #obj.maxRating = 6
    obj.minRating = 6
except Exception as err:
    print err

currRating = 2
print currRating

您可以更改打印以引发异常。

您可以使用内置函数property来实现这一点

实际上,您为您的currRating创建“setter”方法,以便在通过调用目标电流您可以检查它是否在最小值和最大值之间:

例如:

class Machine(object):
    def __init__(self, name, max_rating, min_rating, cur_rating=1):
        self.max_rating = max_rating
        self.min_rating = min_rating
        self._cur_rating = cur_rating

    @property
    def cur_rating(self):
        return self._cur_rating

    @cur_rating.setter
    def cur_rating(self, value):
        if value > self.max_rating or value < self.min_rating:
            raise Exception()
        self._cur_rating = value

您仍然可以访问变量目标电流额定值=10个

相关问题 更多 >