python之中attribute与property么区别

attribute

首先把attribute理解为属性property理解为属性函数

举例1:

class Student(object):
    #把一个getter方法变成属性,只需要加上@property就可以了
    @property
    def score(self):
        #名称前的单下划线,用于指定该名称属性为“私有”。
        return self._score
    #@property本身又创建了另一个装饰器@score.setter
    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value
    #只读属性
    @property
    def age(self):
        return 2015 - self._birth
s = Student()
s.score = 5
s.score=111

想要的输出报错:
ValueError: score must between 0 ~ 100!

举例2:

class Screen(object):

    @property
    def width(self):
        return self._width

    @width.setter
    def width(self, value):
        if not isinstance(value,int):
            raise ValueError("Width must be an integer!")
        self._width = value

    @property
    def height(self):
        return self._height

    @height.setter
    def height(self, value):
        if not isinstance(value, int):
            raise ValueError("Height must be an integer!")
        self._height = value
    #只读属性
    @property
    def resolution(self):
        return self._height * self._width

测试:

# 测试:
s = Screen()
s.width = 1024
s.height = 768
print('resolution =', s.resolution)
if s.resolution == 786432:
    print('测试通过!')
else:
    print('测试失败!')

举例3:

参考https://www.zhihu.com/question/40015172):
定义一个圆,有半径和直径:

class Circle(object):
#直径半径都设置为attribute
    def __init__(self, radius,diameter):
        self.radius = radius
        self.diameter = diameter

实例化:

class Circle(object):
    def __init__(self, radius,diameter):
        self.radius = radius
        self.diameter = diameter


my_circle = Circle(2,4)

print('radius is {}'.format(my_circle.radius))
print('diameter is {}'.format(my_circle.diameter))


#change the radius into 6 
my_circle.radius = 6

print('radius is {}'.format(my_circle.radius))
print('diameter is {}'.format(my_circle.diameter))

结果:
radius is 2
diameter is 4
radius is 6
diameter is 4

property

上面的输出看出明显直径和半径对不上,修改用property的代码:

class Circle(object):
    def __init__(self, radius):
        self.radius = radius

    @property
    def diameter(self):
        return self.radius * 2
    @diameter.setter
    def diameter(self, new_diameter):
        self.radius = new_diameter / 2


my_circle = Circle(2)

print('radius is {}'.format(my_circle.radius))
print('diameter is {}'.format(my_circle.diameter))


#change the radius into 6 
my_circle.radius = 6

print('radius is {}'.format(my_circle.radius))
print('diameter is {}'.format(my_circle.diameter))

#change the diameter into 6 
my_circle.diameter = 6

print('radius is {}'.format(my_circle.radius))
print('diameter is {}'.format(my_circle.diameter))

输出:
radius is 2
diameter is 4
radius is 6
diameter is 12
radius is 3.0
diameter is 6.0

结论:属性是和属性函数比较相似,需要实践理解!

猜你喜欢

转载自blog.csdn.net/nockinonheavensdoor/article/details/80562467