以下四種情況:
只讀不可寫
可寫可讀
不可寫不可讀(那你就沒必要自己把這個成員變量封裝到類裏面了吧)
可寫不可讀(不存在)
所以常見情況其實只有兩種.
@property | @xxx.getter | @xxx.setter | 可寫 | 可讀 | 代碼 | 備註 |
O | X | O | O | O | hello1.py | |
O | X | X | X | O | hello2.py |
@property具備@xxx.setter效果,產生可讀效果.
這三個裝飾器件的效果是:
可讀不一定可寫
可寫的一定可讀
#--------------------------------------附錄---------------------------------------------------------------
hello1.py
class Rectangle(object):
# 服務於返回數值
@property
def width(self):
# 變量名不與方法名重複,改爲true_width,下同
print("@property called")
return self.true_width
# 服務於設數值
@width.setter
def width(self, input_width):
print("setter method called")
print("input_width=",input_width)
self.true_width = input_width
#-----------------------------------------------------------------
@property
def height(self):
return self.true_height
@height.setter
#與property定義的方法名要一致
def height(self, input_height):
self.true_height = input_height
#-----------------------------------------------------------------
s = Rectangle()
# 與方法名一致
s.width = 1024
s.height = 768
print("*********下面是輸出區域************")
print("s.width=",s.width)
print("s.true_width=",s.true_width)
print("--------------------")
print(s.height)
hello2.py
class Student(object):
# 服務於返回(可讀)
@property
def birth(self):
return self._birth
# 服務於設數值(可寫)
@birth.setter
def birth(self, value):
self._birth = value
#-----------------------------------------------------------------
# 服務於返回(可讀)
@property
def age(self):
return 2015 - self._birth
#-----------------------------------------------------------------
s = Student()
# 與方法名一致
s.birth = 1024
# s.age = 768#如果執行此句會報錯
print("*********下面是輸出區域************")
print("s.birth=",s.birth)
print("s.age=",s.age)