AdSense

網頁

2025/6/5

Python @property用法

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


沒有留言:

AdSense