您好我有一个代表或本地日历的课程( 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
我该如何解决这个问题。
答案 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):
答案 4 :(得分:0)
实例变量以下划线开头的原因是提醒程序员在类外调用它们是不好的做法。但是,您始终可以向您的班级添加访问者/获取者方法:
def month(self):
return(self._month)
这样你就可以简单地调用
x.month()
获取与x
相关联的月份。