Python的@property裝飾可用來設定屬性的getter(取得屬性值), setter(設定屬性值)和deleter(刪除屬性值),即物件的屬性僅能透過方法存取或修改以實現物件導向的封裝特性。
參考「Python 簡單類別及物件」中的類別Employee,在這邊利用@property改寫如下。
class Employee:
"""Employee class"""
def __init__(self, id, name):
self._id = id
self._name = name
@property
def id(self):
return self._id
@id.setter
def id(self, id):
self._id = id
@id.deleter
def id(self):
self._id = -1
@property
def name(self):
return self._name
@name.setter
def name(self, name):
self._name = name
@name.deleter
def name(self):
self._name = ''
def __str__(self):
return f'Employee{{id:{self._id},name:{self._name}}}'
def __eq__(self, other):
if not isinstance(other, Employee):
return NotImplemented
return self._id == other._id and self._name == other._name
emp1 = Employee(1, "john")
print(emp1) # Employee{id:1,name:john}
print(emp1.id) # 1
print(emp1.name) # john
emp1.name = 'jojo'
print(emp1) # Employee{id:1,name:jojo}
emp2 = Employee(1, "jojo") # Employee{id:1,name:johnny}
print(emp1 == emp2) # True
del emp1.name
print(emp1) # Employee{id:1,name:}
上面@property裝飾只是一種語法糖,實際上同等於以下使用property()函式來設定屬性的getter、setter和deleter。
class Employee:
"""Employee class"""
def __init__(self, id, name):
self._id = id
self._name = name
def getid(self):
return self._id
def setid(self, id):
self._id = id
def delid(self):
self._id = -1
def getname(self):
return self._name
def setname(self, name):
self._name = name
def delname(self):
self._name = ''
id = property(getid, setid, delid, 'id')
name = property(getname, setname, delname, 'name')
def __str__(self):
return f'Employee{{id:{self._id},name:{self._name}}}'
def __eq__(self, other):
if not isinstance(other, Employee):
return NotImplemented
return self._id == other._id and self._name == other._name
沒有留言:
張貼留言