1. 程式人生 > >python_如何創建可管理的對象屬性

python_如何創建可管理的對象屬性

circle 內置 int __main__ 訪問 @property ini math def

案例:

在面向對象編程中,我們把方法作為對象的接口,自己訪問對象的屬性可能是不安全的,或設計上不靈活,但是使用調用方法在形式上不如訪問屬性簡潔

繁:

circle.getRadius()

circle.setRadius(5.0)

#!/usr/bin/python3

from math import pi


class Circle():
    def __init__(self, radius):
        self.radius = radius
        
    # 獲取半徑接口
    def get_radius(self):
        return self.radius

    # 設置半徑接口
    def set_radius(self, value):
        if isinstance(value, (int, float)):
            self.radius = float(value)
        else:
            raise ValueError(‘wrong type‘)
    
    # 獲取面積接口
    def get_area(self):
        return round(self.radius ** 2 * pi, 2)

if __name__ == ‘__main__‘:
    c = Circle(3.0)
    print(c.get_area())
    
    # 設置半徑
    c.set_radius(5.0)
    print(c.get_radius(), c.get_area())

簡:

circle.radius

circle.radius = 5.0

第二種方式看起來更加舒服簡潔,如何實現?

如何實現?

  1. 通過類裝飾器property,把類方法,變成類似屬性一樣
    # !/usr/bin/python3
    
    from math import pi
    
    
    class Circle():
        def __init__(self, radius):
            self.radius = radius
    
        # 獲取半徑
        @property
        def get_radius(self):
            return self.radius
    
        # 獲取面積
        @property
        def get_area(self):
            return round(self.radius ** 2 * pi, 2)
    
        # 設置半徑值,指明為get_area函數設置值,但是給哪個函數設置值無關緊要,只要是類屬性,其他函數都可以訪問
        @get_area.setter
        def set_radius(self, value):
            if isinstance(value, (int, float)):
                self.radius = float(value)
            else:
                raise ValueError(‘wrong type‘)
    
    
    if __name__ == ‘__main__‘:
        c = Circle(3.0)
        print(c.get_area)
    
        c.set_radius = 5.0
        print(c.get_radius, c.get_area)
    

      

  2. 通過內置property方法
    # !/usr/bin/python3
    
    from math import pi
    
    
    class Circle():
        def __init__(self, radius):
            self.radius = radius
    
        # 獲取半徑
        def get_radius(self):
            return self.radius
    
        # 獲取面積
        def get_area(self):
            return round(self.radius ** 2 * pi, 2)
    
        # 設置半徑值,
        def set_radius(self, value):
            if isinstance(value, (int, float)):
                self.radius = float(value)
            else:
                raise ValueError(‘wrong type‘)
    
        # obj.R 調用第一個函數,obj = 5.0 調用第二個函數,進行設置值,[email protected]
/* */ R = property(get_radius, set_radius) if __name__ == ‘__main__‘: c = Circle(3.0) print(c.get_area()) c.R = 5.0 print(c.R) print(c.R, c.get_area())

python_如何創建可管理的對象屬性