Python类只读变量,名称的开头没有'_'

时间:2016-04-16 04:09:14

标签: python

您好我有一个代表或本地日历的课程( AD 除外) 在这里,我希望所有这些类属性都是只读

class BSDate(object):

def __init__(self, year, month, date):
    self._year = year
    self._month = month
    self._date = date

在Python解释器中,我想得到月份,所以我必须这样做:

x = BSDate(2072,5,2)
x._month

但是我想通过简单地调用

来获得月份
x.month

我该如何解决这个问题。

5 个答案:

答案 0 :(得分:4)

class BSDate(object):
    def __init__(self, year, month, date):
        self._year = year
        self._month = month
        self._date = date

    @property
    def month(self):
        return self._month

您可以将其保留,因为您现在可以使用obj.month来访问它,如果有人尝试AttributeError,则会引发obj.month = val。但是,如果要在运行时通知用户此行为和/或有关错误消息的更多信息,请按如下方式实现相应的setter。

    @property.setter
    def month(self, value):
        # self._month = value if you want to set
        raise AttributeError("Very good error message")
        # or just print to terminal that can't set and go ahead

答案 1 :(得分:3)

您可以使用@property来模拟getter方法

@property
def year(self):
    return self._year

@property
def month(self):
    return self._month

@property
def date(self):
    return self._date

现在您的客户端代码可以是:

my_date = BSDate(y, m, d)
month = my_date.month
year = my_date.year
date = my_date.date

@property也可用于执行"只读"值:

@property.setter
def month(self, value):
    raise AttributeError("This value is read only")

如果客户端尝试修改month

,代码将引发错误

答案 2 :(得分:2)

在Python中,您不应该真正担心私有属性,建议的做法是仅在需要对赋值或计算值强制执行约束时才使用属性和使用属性。 Python的哲学是"我们都同意成年人"一个人不应该让事情变得比他们需要的更复杂。我会简单地使用属性,直到你有充分的理由使用更复杂的东西。

答案 3 :(得分:0)

python中没有办法做一个真正的只读属性。但是,正如其他人提到的那样,您可以使用property装饰器声明一个函数。您还可以通过def __setattr__(self, key, value):

重置setter函数

答案 4 :(得分:0)

实例变量以下划线开头的原因是提醒程序员在类外调用它们是不好的做法。但是,您始终可以向您的班级添加访问者/获取者方法:

def month(self):
    return(self._month)

这样你就可以简单地调用

x.month()

获取与x相关联的月份。